Sobes.tech
Junior

Czy możesz opowiedzieć o zasadach dziedziczenia w programowaniu obiektowym?

sobes.tech AI

Odpowiedź od AI

Dziedziczenie pozwala na tworzenie nowej klasy (pozycji lub pochodnej), opartej na istniejącej klasie (rodzicielskiej, bazowej lub superklasie). Klasa pochodna dziedziczy właściwości (atrybuty) i metody klasy rodzicielskiej, a także może dodawać własne lub nadpisywać odziedziczone.

Główne koncepcje:

  • Rozszerzanie funkcjonalności: Dziedzicząc po klasie rodzicielskiej, klasa pochodna otrzymuje podstawową funkcjonalność i może ją rozszerzać, dodając nowe metody lub właściwości.
  • Nadpisywanie metod: Klasa pochodna może zmienić zachowanie metody odziedziczonej po klasie rodzicielskiej, tworząc metodę o tej samej nazwie (polimorfizm).
  • Ponowne użycie kodu: Pozwala uniknąć duplikacji kodu, ponieważ wspólna logika jest zdefiniowana w klasie rodzicielskiej.
  • Relacja "jest": Dziedziczenie modeluje relację "jest czymś" (is-a). Na przykład, "Kot jest zwierzęciem".
<?php

class Animal {
    protected $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function speak() {
        echo "Nieznany dźwięk\n";
    }
}

class Dog extends Animal {
    public function speak() {
        echo "Hau-hau!\n";
    }
}

class Cat extends Animal {
    public function speak() {
        echo "Miau-miau!\n";
    }
}

$dog = new Dog("Bobby");
$dog->speak(); // Wypis: Hau-hau!

$cat = new Cat("Murka");
$cat->speak(); // Wypis: Miau-miau!

?>

W PHP dziedziczenie realizuje się za pomocą słowa kluczowego extends. Klasa może dziedziczyć tylko od jednej klasy (dziedziczenie pojedyncze), ale może implementować wiele interfejsów.

Dostęp do właściwości i metod klasy rodzicielskiej z klasy pochodnej jest możliwy za pomocą słowa kluczowego parent::.

<?php

class ParentClass {
    protected $value = "wartość rodzica";

    public function showValue() {
        echo $this->value . "\n";
    }
}

class ChildClass extends ParentClass {
    // Nadpisanie właściwości
    protected $value = "wartość dziecka";

    public function showValues() {
        // Wywołanie metody klasy rodzicielskiej
        parent::showValue();
        // Wyświetlenie wartości klasy dziecka
        echo $this->value . "\n";
    }
}

$obj = new ChildClass();
$obj->showValues();
// Wypis:
// wartość rodzica
// wartość dziecka

?>

Kluczowe modyfikatory dostępu:

  • public: Dostępny z dowolnego miejsca.
  • protected: Dostępny w klasie i w klasach dziedziczących.
  • private: Dostępny tylko w klasie.

Metody mogą być oznaczone jako final, co uniemożliwia ich nadpisanie w klasach pochodnych. Klasy mogą być również final, co uniemożliwia ich dziedziczenie. Mogą być abstract, co wymaga ich implementacji w klasach pochodnych.