Můžeš vysvětlit principy dědičnosti v objektově orientovaném programování?
sobes.tech AI
Odpověď od AI
Dědičnost umožňuje vytvářet novou třídu (odvozenou nebo podtřídu), založenou na existující třídě (mateřské, základní nebo supertřída). Odvozená třída dědí vlastnosti (atributy) a metody mateřské třídy, a také může přidávat své vlastní nebo přepisovat zděděné.
Hlavní koncepty:
- Rozšíření funkčnosti: Děděním od mateřské třídy získává odvozená třída základní funkčnost a může ji rozšiřovat přidáváním nových metod nebo vlastností.
- Přepisování metod: Odvozená třída může změnit chování metody zděděné od mateřské třídy tím, že vytvoří metodu se stejným jménem (polymorfismus).
- Opakované použití kódu: Umožňuje se vyhnout duplicitě kódu, protože společná logika je definována v mateřské třídě.
- Vztah "je": Dědičnost modeluje vztah "je něco" (is-a). Například "Kočka je zvíře".
<?php
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "Neznámý zvuk\n";
}
}
class Dog extends Animal {
public function speak() {
echo "Haf-haf!\n";
}
}
class Cat extends Animal {
public function speak() {
echo "Mňau-mňau!\n";
}
}
$dog = new Dog("Bobeš");
$dog->speak(); // Výstup: Haf-haf!
$cat = new Cat("Murka");
$cat->speak(); // Výstup: Mňau-mňau!
?>
V PHP je dědičnost realizována pomocí klíčového slova extends. Jedna třída může dědit pouze od jedné třídy (jednoduchá dědičnost), ale může implementovat více rozhraní.
Přístup k vlastnostem a metodám mateřské třídy z odvozené je možný pomocí klíčového slova parent::.
<?php
class ParentClass {
protected $value = "mateřská hodnota";
public function showValue() {
echo $this->value . "\n";
}
}
class ChildClass extends ParentClass {
// Přepis vlastnosti
protected $value = "dceřiná hodnota";
public function showValues() {
// Volání metody mateřské třídy
parent::showValue();
// Výpis hodnoty dceřiné třídy
echo $this->value . "\n";
}
}
$obj = new ChildClass();
$obj->showValues();
// Výstup:
// mateřská hodnota
// dceřiná hodnota
?>
Klíčové modifikátory přístupu:
public: Přístupný odkudkoliv.protected: Přístupný uvnitř třídy a v dědících třídách.private: Přístupný pouze uvnitř třídy.
Metody mohou být označeny jako final, což zakazuje jejich přepisování v dceřiných třídách. Třídy mohou být také final, což zakazuje jejich dědění. Mohou být také abstract, což vyžaduje jejich implementaci v dceřiných třídách.