Sobes.tech
Junior

Podes falar sobre os princípios de herança na programação orientada a objetos?

sobes.tech IA

Resposta da IA

A herança permite criar uma nova classe (filha ou derivada), baseada numa classe existente (pai, base ou superclasse). A classe filha herda as propriedades (atributos) e métodos da classe pai, e também pode adicionar as suas próprias ou sobrescrever as herdadas.

Conceitos principais:

  • Extensão de funcionalidade: Ao herdar da classe pai, a classe filha obtém funcionalidade básica e pode expandi-la, adicionando novos métodos ou propriedades.
  • Sobrescrita de métodos: A classe filha pode alterar o comportamento de um método herdado da classe pai criando um método com o mesmo nome (polimorfismo).
  • Reutilização de código: Permite evitar a duplicação de código, pois a lógica comum é definida na classe pai.
  • Relação "é": A herança modela a relação "é um" (is-a). Por exemplo, "Um gato é um animal".
<?php

class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function speak() {
        echo "Som desconhecido\n";
    }
}

class Dog extends Animal {
    public function speak() {
        echo "Au-au!\n";
    }
}

class Cat extends Animal {
    public function speak() {
        echo "Miau-miau!\n";
    }
}

$dog = new Dog("Bobby");
$dog->speak(); // Saída: Au-au!

$cat = new Cat("Murka");
$cat->speak(); // Saída: Miau-miau!

?>

Em PHP, a herança é feita com a palavra-chave extends. Uma classe pode herdar apenas de uma classe (herança simples), mas pode implementar múltiplas interfaces.

O acesso às propriedades e métodos da classe pai a partir da classe filha é possível usando a palavra-chave parent::.

<?php

class ParentClass {
    protected $value = "valor do pai";

    public function showValue() {
        echo $this->value . "\n";
    }
}

class ChildClass extends ParentClass {
    // Sobrescrever a propriedade
    protected $value = "valor da filha";

    public function showValues() {
        // Chamar método da classe pai
        parent::showValue();
        // Mostrar valor da classe filha
        echo $this->value . "\n";
    }
}

$obj = new ChildClass();
$obj->showValues();
// Saída:
// valor do pai
// valor da filha

?>

Modificadores de acesso principais:

  • public: Disponível em qualquer lugar.
  • protected: Disponível dentro da classe e nas classes que a herdam.
  • private: Disponível apenas dentro da classe.

Métodos podem ser declarados final, o que impede a sua sobrescrição em classes filhas. Classes também podem ser final, o que impede a sua herança. Podem ser abstract, o que exige a sua implementação em classes filhas.