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}`);
}
}
Estudanteherdanomee o métodoapresentardePessoa, 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
protectedficam 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.
