Fácil TypeScript

Formas geométricas com classe abstrata

Enunciado

Crie uma classe abstrata Forma com um método abstrato area(): number e um método concreto descricao(): string que retorna "A área é X". Depois, crie as classes Retangulo e Circulo que estendem Forma e implementam area(). No final, instancie cada uma e exiba a descrição.

Requisitos

  • A classe Forma deve ser abstrata e ter o método abstrato area.
  • Retangulo e Circulo devem implementar area() corretamente.
  • O programa deve imprimir a descrição de cada forma.

Código inicial

abstract class Forma {
  abstract area(): number;

  descricao(): string {
    return `A área é ${this.area()}`;
  }
}

// Complete as classes Retangulo e Circulo

Saída esperada

A área é 50
A área é 78.53981633974483
Ver dica

Use Math.PI para o círculo. O retângulo pode receber largura e altura no construtor.

Mostrar solução
abstract class Forma {
  abstract area(): number;

  descricao(): string {
    return `A área é ${this.area()}`;
  }
}

class Retangulo extends Forma {
  constructor(private largura: number, private altura: number) {
    super();
  }

  area(): number {
    return this.largura * this.altura;
  }
}

class Circulo extends Forma {
  constructor(private raio: number) {
    super();
  }

  area(): number {
    return Math.PI * this.raio ** 2;
  }
}

const ret = new Retangulo(10, 5);
console.log(ret.descricao());

const circ = new Circulo(5);
console.log(circ.descricao());

Passo a passo

  1. Declaramos abstract class Forma com o método abstrato area(): number. Isso obriga as subclasses a implementarem area.
  2. O método concreto descricao() usa this.area() para montar a string. Como area é abstrato, a chamada será resolvida na subclasse.
  3. Retangulo estende Forma e implementa area() multiplicando largura e altura.
  4. Circulo estende Forma e implementa area() usando Math.PI * raio ** 2.
  5. No programa principal, criamos instâncias e chamamos descricao(), que internamente chama o area() correto de cada subclasse.

Por que funciona

A classe abstrata define o contrato e parte do comportamento comum. As subclasses fornecem a implementação específica do método abstrato. O método concreto descricao pode ser reutilizado por todas as formas sem duplicação.

Erros comuns

  • Esquecer de implementar area() na subclasse: o TypeScript acusa erro de classe abstrata não implementada.
  • Tentar instanciar new Forma(): erro de compilação, pois classes abstratas não podem ser instanciadas.
  • Não chamar super() no construtor da subclasse: erro em tempo de execução se a classe base tiver construtor.

Outra forma de resolver

Poderia usar uma interface Forma com area(): number e uma função separada descricao(forma: Forma). Mas a classe abstrata permite compartilhar a implementação de descricao diretamente.

Saída esperada

A área é 50
A área é 78.53981633974483