Sobes.tech
Junior

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.