Classes abstratas
Classes abstratas em TypeScript são usadas como modelos para outras classes, permitindo definir tanto métodos já implementados quanto métodos a serem obrigatoriamente definidos por subclasses. Elas não podem ser instanciadas diretamente e servem como base para promover reuso de código e polimorfismo.
Conceito de Classe Abstrata
Uma classe abstrata utiliza a palavra-chave abstract na definição e serve como um “esqueleto” para classes derivadas. Ela pode ter:
- Métodos abstratos: apenas assinaturas, obrigatórias de serem implementadas nas subclasses.
- Métodos concretos: implementação comum, herdada pelas subclasses.
abstract class Animal {
abstract makeSound(): void; // Método abstrato
move(): void { // Método concreto (com implementação)
console.log("Movendo...");
}
}
Instanciação e Uso
Não é possível criar objetos diretamente de uma classe abstrata. Somente subclasses podem ser instanciadas. As subclasses devem implementar todos os métodos abstratos da classe base.
class Dog extends Animal {
makeSound(): void {
console.log("Au au!");
}
}
const dog = new Dog();
dog.makeSound(); // Au au!
dog.move(); // Movendo...
Exemplo Prático com Herança
Suponha uma hierarquia de figuras geométricas:
abstract class FiguraGeometrica {
abstract calcularArea(): number;
public desenhar(): void {
console.log("Desenhando figura geométrica...");
}
}
class Retangulo extends FiguraGeometrica {
constructor(private base: number, private altura: number) {
super();
}
calcularArea(): number {
return this.base * this.altura;
}
}
const retangulo = new Retangulo(5, 7);
console.log(retangulo.calcularArea()); // 35
retangulo.desenhar(); // Desenhando figura geométrica...
Campos Abstratos
Além de métodos, campos também podem ser declarados como abstratos e, portanto, precisam ser implementados nas subclasses.
abstract class Shape {
abstract x: number;
abstract y: number;
abstract getArea(): number;
}
class Rectangle extends Shape {
constructor(
public x: number,
public y: number,
public width: number,
public height: number
) {
super();
}
getArea(): number {
return this.width * this.height;
}
}
Diferença entre Classe Abstrata e Interface
- Classe abstrata: Pode conter implementação e atributos, além de métodos abstratos.
- Interface: Apenas define métodos/atributos, sem fornecer nenhuma implementação.
Use classe abstrata quando deseja forçar uma implementação base compartilhada; use interface apenas para contrato de implementação.
Classes abstratas são essenciais para organizar o código e criar hierarquias orientadas a objetos mais robustas e reaproveitáveis em TypeScript.
