Môžeš rozprávať o princípoch dedičnosti v objektovo orientovanom programovaní?
sobes.tech AI
Odpoveď od AI
Dedičstvo umožňuje vytvárať novú triedu (odvodenú alebo podtriedu), založenú na existujúcej triede (rodičovskej, základnej alebo supertriede). Odvodná trieda dedí vlastnosti (atribúty) a metódy rodičovskej triedy, a tiež môže pridávať svoje vlastné alebo prepísať zdedené.
Hlavné koncepty:
- Rozšírenie funkčnosti: Dedí od rodičovskej triedy, odvodná trieda získa základnú funkčnosť a môže ju rozširovať pridávaním nových metód alebo vlastností.
- Prepísanie metód: Odvodná trieda môže zmeniť správanie metódy zdedené od rodičovskej triedy vytvorením metódy s rovnakým menom (polymorfizmus).
- Opakované použitie kódu: Umožňuje vyhnúť sa duplikácii kódu, pretože spoločná logika je definovaná v rodičovskej triede.
- Vztah "je": Dedičstvo modeluje vzťah "je niečo" (is-a). Napríklad, "Mačka je zviera".
<?php
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "Neznámy 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 dedičstvo realizované pomocou kľúčového slova extends. Jedna trieda môže dediť iba od jednej triedy (jednoduché dedičstvo), ale môže implementovať viac rozhraní.
Prístup k vlastnostiam a metódam rodičovskej triedy z odvodenej je možný pomocou kľúčového slova parent::.
<?php
class ParentClass {
protected $value = "rodičovská hodnota";
public function showValue() {
echo $this->value . "\n";
}
}
class ChildClass extends ParentClass {
// Prepis vlastnosti
protected $value = "detská hodnota";
public function showValues() {
// Volanie metódy rodičovskej triedy
parent::showValue();
// Výpis hodnoty detskej triedy
echo $this->value . "\n";
}
}
$obj = new ChildClass();
$obj->showValues();
// Výstup:
// rodičovská hodnota
// detská hodnota
?>
Kľúčové modifikátory prístupu:
public: Dostupné odkiaľkoľvek.protected: Dostupné v rámci triedy a v odvodených triedach.private: Dostupné iba v rámci triedy.
Metódy môžu byť deklarované ako final, čo zakazuje ich prepísanie v odvodených triedach. Triedy môžu byť tiež final, čo zakazuje ich dedičstvo. Môžu byť aj abstract, čo vyžaduje ich implementáciu v odvodených triedach.