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
Formadeve serabstracte ter o método abstratoarea.RetanguloeCirculodevem implementararea.- O método
descricaodeve usarnumber_formatcom 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
Formaé declaradaabstracte define o método abstratoarea.- O método concreto
descricaochama$this->area(), que será resolvido nas filhas. Retanguloimplementaareamultiplicando largura e altura.CirculoimplementaareausandoM_PIe o raio ao quadrado.- Cada classe tem seu próprio construtor para receber os dados necessários.
- 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
Formadiretamente: gera erro fatal. - Esquecer de implementar
areana classe filha: erro fatal. - Usar
number_formatsem o segundo argumento: o padrão é 0 casas decimais, resultando em12em vez de12.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