Junior
Qual é a essência de uma classe abstrata?
sobes.tech IA
Resposta da IA
A essência de uma classe abstrata é servir como modelo para outras classes. Ela não pode ser criada diretamente, mas pode conter métodos abstratos (sem corpo), que devem ser implementados nas classes derivadas, bem como métodos e propriedades concretas.
Pontos-chave:
- Não é possível criar uma instância:
new ClasseAbstrata()causará um erro. - Herança: Pode-se herdar apenas de uma classe abstrata (
extends). - Métodos abstratos: Definem a interface que as classes derivadas devem implementar. São marcados com a palavra-chave
abstracte não possuem corpo. - Métodos e propriedades concretas: Podem ser definidas e utilizadas diretamente, bem como sobrescritas nas classes derivadas.
- Implementação parcial: Fornece uma estrutura geral e alguma funcionalidade básica, deixando os detalhes de implementação ao critério das classes derivadas.
Exemplo:
<?php
abstract class Forma {
protected $cor;
public function __construct($cor) {
$this->cor = $cor;
}
abstract public function calcularArea(); // Método abstrato
public function obterCor() {
return $this->cor;
}
}
class Circulo extends Forma {
private $raio;
public function __construct($cor, $raio) {
parent::__construct($cor);
$this->raio = $raio;
}
public function calcularArea() {
return pi() * $this->raio * $this->raio;
}
}
class Quadrado extends Forma {
private $lado;
public function __construct($cor, $lado) {
parent::__construct($cor);
$this->lado = $lado;
}
public function calcularArea() {
return $this->lado * $this->lado;
}
}
// Exemplo de uso
$circulo = new Circulo("Vermelho", 5);
echo "Área do círculo: " . $circulo->calcularArea() . ", Cor: " . $circulo->obterCor() . "\n";
$quadrado = new Quadrado("Azul", 4);
echo "Área do quadrado: " . $quadrado->calcularArea() . ", Cor: " . $quadrado->obterCor() . "\n";
// O próximo código causará um erro fatal: instanciando uma classe abstrata
// $formaAbstrata = new Forma("Desconhecido");
Tabela comparativa com interfaces e classes normais:
| Característica | Classe abstrata | Interface | Classe normal |
|---|---|---|---|
| Criação de instância | Não | Não | Sim |
| Herdar | Sim (extends) + Implementar (implements) |
Apenas Implementar (implements) |
Sim (extends) |
| Métodos | Concretos e abstratos | Apenas abstratos (sem corpo) | Apenas concretos |
| Propriedades | Sim | Não | Sim |
| Herdar múltiplas vezes | Não | Sim | Não |
| Finalidade | Implementação parcial, estrutura geral | Definição de contrato (comportamento) | Implementação completa, objeto concreto |
Usado quando há lógica e propriedades comuns que devem estar em um grupo de classes relacionadas, mas seu comportamento (implementação de alguns métodos) varia. Permite reutilização de código e uniformidade na estrutura das classes.