Diferença entre extends e implements em TypeScript
- #TypeScript
- #POO
A palavra-chave extends é usada em TypeScript (e também em outras linguagens de programação orientadas a objetos) para criar uma classe que herda de outra classe. Quando uma classe estende outra, ela herda todas as propriedades e métodos da classe base (superclasse). A classe derivada (subclasse) pode adicionar novas propriedades e métodos ou sobrescrever métodos existentes da classe base.
Extends
No exemplo abaixo, a classe Carro estende a classe Veiculo, herdando suas propriedades e métodos. Além disso, Carro adiciona uma nova propriedade “numeroDePortas ”e um novo método "abrirPorta", além de sobrescrever o método descrever.
// Definindo a classe base Veiculo
class Veiculo {
marca: string;
modelo: string;
ano: number;
constructor(marca: string, modelo: string, ano: number) {
this.marca = marca;
this.modelo = modelo;
this.ano = ano;
}
descrever(): string {
return `Este veículo é um ${this.marca} ${this.modelo} do ano ${this.ano}.`;
}
ligar(): string {
return `O ${this.marca} ${this.modelo} está ligado.`;
}
}
// Definindo a classe derivada Carro que estende Veiculo
class Carro extends Veiculo {
numeroDePortas: number;
constructor(marca: string, modelo: string, ano: number, numeroDePortas: number) {
super(marca, modelo, ano); // Chamando o construtor da classe base
this.numeroDePortas = numeroDePortas;
}
// Sobrescrevendo o método descrever
descrever(): string {
return `${super.descrever()} Ele tem ${this.numeroDePortas} portas.`;
}
abrirPorta(porta: number): string {
if (porta > 0 && porta <= this.numeroDePortas) {
return `A porta ${porta} está aberta.`;
} else {
return `Este carro não tem a porta número ${porta}.`;
}
}
}
// Exemplo de uso das classes
const meuCarro = new Carro('Toyota', 'Corolla', 2020, 4);
A palavra-chave implements é usada para garantir que uma classe satisfaça um contrato especificado por uma interface. Uma interface define um conjunto de propriedades e métodos que a classe deve implementar, mas não fornece implementações para esses métodos. Quando uma classe implementa uma interface, ela deve fornecer implementações para todos os membros da interface.
Implements
No exemplo abaixo, a interface Descritível define o método descrever. A classe Moto implementa esta interface, garantindo que o método descrever esteja presente na classe Moto.
// Definindo a interface Descritivel
interface Descritivel {
descrever(): string;
}
// Definindo a classe Moto que implementa a interface Descritivel
class Moto implements Descritivel {
marca: string;
modelo: string;
ano: number;
constructor(marca: string, modelo: string, ano: number) {
this.marca = marca;
this.modelo = modelo;
this.ano = ano;
}
descrever(): string {
return `Esta moto é uma ${this.marca} ${this.modelo} do ano ${this.ano}.`;
}
}
// Exemplo de uso da classe Moto
const minhaMoto = new Moto('Honda', 'CBR', 2019);
Diferença principal
- extends é usado para herança de classes, onde uma classe herda propriedades e métodos de outra classe.
- implements é usado para implementar interfaces, onde uma classe deve fornecer implementações para os métodos e propriedades definidos pela interface.
Enquanto extends envolve a herança de funcionalidade existente, implements envolve a conformidade com um contrato especificado.