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.