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.