Desafio JavaScript
Sistema de Formas Geométricas
Enunciado
Crie uma classe abstrata Forma com um campo privado #nome e um método area() que lança um erro 'Método area() deve ser implementado'. Adicione um getter nome. Em seguida, crie as classes Circulo e Retangulo que estendem Forma. Circulo recebe raio e implementa area() retornando π * raio². Retangulo recebe largura e altura e implementa area() retornando largura * altura. Ambas devem chamar super com o nome da forma. Crie uma função imprimirArea(forma) que recebe uma forma e imprime "A área do [nome] é [area]". Instancie um círculo de raio 3 e um retângulo de 4x5, e chame imprimirArea para cada um.
Requisitos
Formadeve ter campo privado#nome, getternomee métodoarea()que lança erro.CirculoeRetangulodevem estenderFormae implementararea().- Os construtores de
CirculoeRetangulodevem chamarsupercom o nome. - A função
imprimirAreadeve usar o getternomee o métodoarea(). - A saída deve mostrar as áreas calculadas corretamente.
Código inicial
class Forma {
// seu código aqui
}
class Circulo extends Forma {
// seu código aqui
}
class Retangulo extends Forma {
// seu código aqui
}
function imprimirArea(forma) {
// seu código aqui
}
const circulo = new Circulo(3);
imprimirArea(circulo);
const retangulo = new Retangulo(4, 5);
imprimirArea(retangulo);
Saída esperada
A área do Círculo é 28.274333882308138
A área do Retângulo é 20
Ver dica
Use Math.PI para o valor de π. No método area() da classe Forma, lance new Error('Método area() deve ser implementado').
Mostrar solução
class Forma {
#nome;
constructor(nome) {
this.#nome = nome;
}
get nome() {
return this.#nome;
}
area() {
throw new Error('Método area() deve ser implementado');
}
}
class Circulo extends Forma {
#raio;
constructor(raio) {
super('Círculo');
this.#raio = raio;
}
area() {
return Math.PI * this.#raio ** 2;
}
}
class Retangulo extends Forma {
#largura;
#altura;
constructor(largura, altura) {
super('Retângulo');
this.#largura = largura;
this.#altura = altura;
}
area() {
return this.#largura * this.#altura;
}
}
function imprimirArea(forma) {
console.log(`A área do ${forma.nome} é ${forma.area()}`);
}
const circulo = new Circulo(3);
imprimirArea(circulo);
const retangulo = new Retangulo(4, 5);
imprimirArea(retangulo);
Passo a passo
- A classe
Formatem um campo privado#nome, um construtor que o define e um getternome. - O método
area()lança um erro para forçar subclasses a implementá-lo. CirculoestendeForma, chamasuper('Círculo')e armazena#raio.- O método
area()deCirculocalcula a área usandoMath.PIe o raio ao quadrado. RetanguloestendeForma, chamasuper('Retângulo')e armazena#largurae#altura.- O método
area()deRetangulomultiplica largura por altura. - A função
imprimirAreaacessaforma.nome(getter) eforma.area()(método) e imprime a mensagem. - Criamos as instâncias e chamamos
imprimirAreapara cada uma.
Por que funciona
A classe Forma define um contrato: toda forma tem um nome e um método area(). As subclasses implementam area() de acordo com sua geometria. O uso de super garante que o nome seja inicializado corretamente. O polimorfismo permite que imprimirArea funcione com qualquer objeto que herde de Forma.
Erros comuns
- Não chamar
superno construtor da subclasse: erro ao usarthis. - Esquecer de implementar
area()na subclasse: ao chamar, o método da classe pai lançará erro. - Tentar acessar
circulo.#raiofora da classe: erro de sintaxe. - Usar
Math.piem vez deMath.PI:Math.piéundefined, resultando emNaN.
Outra forma de resolver
Se não precisar de campo privado, pode usar propriedades públicas. Mas a versão com # protege os dados internos.
Saída esperada
A área do Círculo é 28.274333882308138
A área do Retângulo é 20