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
Formadeve ser abstrata e ter o método abstratoarea. RetanguloeCirculodevem implementararea()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
- Declaramos
abstract class Formacom o método abstratoarea(): number. Isso obriga as subclasses a implementaremarea. - O método concreto
descricao()usathis.area()para montar a string. Comoareaé abstrato, a chamada será resolvida na subclasse. RetanguloestendeFormae implementaarea()multiplicando largura e altura.CirculoestendeFormae implementaarea()usandoMath.PI * raio ** 2.- No programa principal, criamos instâncias e chamamos
descricao(), que internamente chama oarea()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