Sobes.tech
Junior

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.