Herança

A herança em TypeScript permite criar hierarquias de classes, onde uma subclasse pode reutilizar e especializar o comportamento de uma superclasse. O mecanismo usa a palavra-chave extends e o operador super para acesso ao construtor e métodos da classe-base.

Conceito de Herança

A herança permite que uma classe (subclasse) tenha acesso às propriedades e métodos de outra classe (superclasse), favorecendo a reutilização e a organização do código.

class Animal {
nome: string;
constructor(nome: string) {
this.nome = nome;
}
emitirSom() {
console.log("Som genérico");
}
}

A classe Animal serve como base para outras classes.

Sintaxe: extends e super

Para herdar de uma classe, utiliza-se extends.
A subclasse pode acessar o construtor da superclasse usando super.

class Cachorro extends Animal {
constructor(nome: string) {
super(nome); // Chama o construtor da superclasse
}
emitirSom() {
console.log(`${this.nome} late`);
}
}

Aqui, Cachorro herda a propriedade nome e sobrescreve o método emitirSom.

Exemplo Prático: Hierarquia de Pessoas

class Pessoa {
nome: string;
constructor(nome: string) {
this.nome = nome;
}
apresentar() {
console.log(`Meu nome é ${this.nome}`);
}
}

class Estudante extends Pessoa {
disciplina: string;
constructor(nome: string, disciplina: string) {
super(nome);
this.disciplina = disciplina;
}
apresentar() {
console.log(`Meu nome é ${this.nome} e estudo ${this.disciplina}`);
}
}
  • Estudante herda nome e o método apresentar de Pessoa, podendo também sobrescrever métodos e adicionar propriedades.

Referenciando tipos da superclasse

É possível declarar variáveis do tipo da superclasse e armazenar objetos de subclasses:

typescriptlet p: Pessoa = new Estudante("João", "Matemática");
p.apresentar(); // Chamará a versão sobrescrita em Estudante

Isso é útil para polimorfismo.

Herança Múltipla e Interfaces

TypeScript suporta herança de uma única classe, mas pode implementar múltiplas interfaces para simular herança múltipla de contratos.

Métodos protegidos (protected)

Permite métodos e propriedades visíveis apenas pela classe base e suas subclasses:

class Veiculo {
protected velocidade: number = 0;
acelerar() {
this.velocidade += 10;
}
}
class Carro extends Veiculo {
mostrarVelocidade() {
console.log(this.velocidade);
}
}
  • Propriedades/métodos protected ficam ocultos para uso externo, mas acessíveis às subclasses.

Exemplo Completo

class Funcionario extends Pessoa {
salario: number;
constructor(nome: string, salario: number) {
super(nome);
this.salario = salario;
}
apresentar() {
console.log(`Meu nome é ${this.nome} e ganho ${this.salario}€`);
}
}

let f = new Funcionario("Lucia", 2500);
let e = new Estudante("Carlos", "História");
f.apresentar(); // Meu nome é Lucia e ganho 2500€
e.apresentar(); // Meu nome é Carlos e estudo História
  • Classes podem ter métodos/propriedades específicos, além dos herdados.

Resumo

  • extends define a relação de herança.
  • super chama o construtor da superclasse.
  • Subclasses podem sobrescrever métodos e adicionar novas propriedades.
  • Variáveis do tipo da superclasse podem receber instâncias das subclasses.
  • TypeScript também suporta propriedades e métodos protegidos e polimorfismo.

Esses conceitos criam sistemas mais organizados, reaproveitando e especializando funcionalidades. Se desejar exemplos de herança com métodos estáticos ou interfaces também integradas, isso pode ser detalhado.