Sobes.tech
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 abstract e 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.