Aparência
Herança e Polimorfismo
Herança e polimorfismo são conceitos fundamentais da programação orientada a objetos (OOP) e são totalmente suportados pelo TypeScript. Esses conceitos permitem a criação de códigos mais reutilizáveis, organizados e flexíveis. Vamos explorar como a herança de classes e a sobrescrita de métodos funcionam em TypeScript.
Herança de Classes
A herança permite que uma classe (chamada de classe derivada ou subclasse) herde propriedades e métodos de outra classe (chamada de classe base ou superclasse). Isso promove a reutilização de código e a criação de hierarquias de classes.
Definindo uma Classe Base:
Vamos começar definindo uma classe base simples chamada Animal:
typescript
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log("Some generic animal sound");
}
}Criando uma Classe Derivada:
Agora, vamos criar uma classe derivada chamada Dog que herda de Animal:
typescript
class Dog extends Animal {
constructor(name: string) {
super(name); // Chama o construtor da classe base
}
makeSound(): void {
console.log("Woof! Woof!");
}
}Neste exemplo, Dog herda todas as propriedades e métodos de Animal. A palavra-chave extends é usada para definir a herança, e o método super é chamado no construtor da subclasse para garantir que o construtor da classe base seja executado.
Sobrescrita de Métodos
A sobrescrita de métodos permite que uma subclasse forneça uma implementação específica de um método que já é definido na sua superclasse. Isso é útil para modificar ou estender o comportamento herdado.
Sobrescrita em Ação:
No exemplo acima, o método makeSound foi sobrescrito na classe Dog:
typescript
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log("Woof! Woof!");
}
}Quando makeSound é chamado em uma instância de Dog, a implementação específica de Dog será executada, em vez da implementação genérica da classe Animal.
Polimorfismo:
O polimorfismo permite que uma função trate objetos de diferentes classes de forma uniforme. Em TypeScript, isso é geralmente alcançado através da herança e da sobrescrita de métodos.
Exemplo de Polimorfismo:
Vamos ver um exemplo de polimorfismo em ação:
typescript
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log("Some generic animal sound");
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log("Woof! Woof!");
}
}
class Cat extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log("Meow! Meow!");
}
}
function makeAnimalsSound(animals: Animal[]) {
animals.forEach((animal) => {
animal.makeSound();
});
}
const animals: Animal[] = [new Dog("Buddy"), new Cat("Whiskers")];
makeAnimalsSound(animals);Neste exemplo, a função makeAnimalsSound aceita um array de Animal e chama o método makeSound em cada um deles. Graças ao polimorfismo, a implementação correta do método makeSound é chamada para cada objeto, seja ele um Dog ou um Cat.
Conclusão
A herança e o polimorfismo são poderosos conceitos da OOP que permitem criar estruturas de código mais flexíveis e reutilizáveis. Em TypeScript, esses conceitos são implementados de forma intuitiva e robusta, facilitando a criação de hierarquias de classes e a sobrescrita de métodos para personalizar o comportamento das subclasses. Usando esses recursos de maneira eficaz, você pode desenvolver aplicações mais eficientes e de fácil manutenção.