Médio PHP

Formas geométricas com abstract

Enunciado

Crie uma classe abstrata Forma com o método abstrato area(): float e um método concreto descricao(): string que retorna "Área: X". Implemente Retangulo e Circulo que estendem Forma. Instancie cada uma e exiba a descrição.

Requisitos

  • Forma deve ser abstract e ter o método abstrato area.
  • Retangulo e Circulo devem implementar area.
  • O método descricao deve usar number_format com 2 casas decimais.
  • A saída deve mostrar a área de um retângulo 3x4 e de um círculo de raio 2.

Código inicial

<?php
abstract class Forma {
    abstract public function area(): float;
    public function descricao(): string {
        // implemente
    }
}

class Retangulo extends Forma {
    // implemente
}

class Circulo extends Forma {
    // implemente
}

$r = new Retangulo(3, 4);
echo $r->descricao() . PHP_EOL;
$c = new Circulo(2);
echo $c->descricao() . PHP_EOL;

Saída esperada

Área: 12.00
Área: 12.57
Ver dica

O método descricao pode chamar $this->area() mesmo sendo abstrato, pois as filhas o implementarão.

Mostrar solução
<?php
declare(strict_types=1);

abstract class Forma
{
    abstract public function area(): float;

    public function descricao(): string
    {
        return "Área: " . number_format($this->area(), 2);
    }
}

class Retangulo extends Forma
{
    public function __construct(
        private float $largura,
        private float $altura
    ) {}

    public function area(): float
    {
        return $this->largura * $this->altura;
    }
}

class Circulo extends Forma
{
    public function __construct(private float $raio) {}

    public function area(): float
    {
        return M_PI * $this->raio ** 2;
    }
}

$r = new Retangulo(3, 4);
echo $r->descricao() . PHP_EOL;
$c = new Circulo(2);
echo $c->descricao() . PHP_EOL;

Passo a passo

  1. Forma é declarada abstract e define o método abstrato area.
  2. O método concreto descricao chama $this->area(), que será resolvido nas filhas.
  3. Retangulo implementa area multiplicando largura e altura.
  4. Circulo implementa area usando M_PI e o raio ao quadrado.
  5. Cada classe tem seu próprio construtor para receber os dados necessários.
  6. Instanciamos e chamamos descricao, que formata a área com duas casas.

Por que funciona

A classe abstrata define um contrato: toda forma precisa calcular sua área, mas cada uma faz isso de maneira diferente. O método descricao é genérico e depende do polimorfismo para chamar a implementação correta. Isso permite tratar todas as formas de maneira uniforme.

Erros comuns

  • Tentar instanciar Forma diretamente: gera erro fatal.
  • Esquecer de implementar area na classe filha: erro fatal.
  • Usar number_format sem o segundo argumento: o padrão é 0 casas decimais, resultando em 12 em vez de 12.00.

Outra forma de resolver

Poderia usar uma interface em vez de classe abstrata, mas perderíamos o método concreto descricao.

Saída esperada

Área: 12.00
Área: 12.57