Sobes.tech
Junior

Ar galite papasakoti apie paveldėjimo principus objektinio programavimo?

sobes.tech AI

Atsakymas iš AI

Paveldėjimas leidžia sukurti naują klasę (paveldėtą arba išvestinę), pagrįstą esama klase (tėvų, pagrindinę arba superklasę). Išvestinė klasė paveldi tėvų klasės savybes (atributus) ir metodus, taip pat gali pridėti savo arba perrašyti paveldėtus.

Pagrindinės koncepcijos:

  • Funkcionalumo plėtra: Paveldėdama iš tėvų klasės, išvestinė klasė gauna pagrindinę funkcionalumą ir gali ją plėsti pridėdama naujus metodus ar savybes.
  • Metodų perrašymas: Išvestinė klasė gali pakeisti paveldėtą iš tėvų klasės metodo elgseną, sukurdama tą patį pavadinimą turintį metodą (polimorfizmas).
  • Kodo pakartotinis naudojimas: Tai leidžia išvengti kodo dubliavimo, nes bendroji logika apibrėžiama tėvų klasėje.
  • "Yra" santykis: Paveldėjimas modeliuoja "yra kažkas" santykį (is-a). Pavyzdžiui, "Katė yra gyvūnas".
<?php

class Animal {
    protected $name;

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

    public function speak() {
        echo "Nežinomas garsas\n";
    }
}

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

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

$dog = new Dog("Bobiukas");
$dog->speak(); // Išvestis: Au-au!

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

?>

PHP paveldėjimas realizuojamas naudojant raktinį žodį extends. Viena klasė gali paveldėti tik iš vienos klasės (viengubas paveldėjimas), tačiau gali įgyvendinti kelis sąsajos (interfeiso) tipus.

Prieigą prie tėvų klasės savybių ir metodų iš išvestinės klasės galima pasiekti naudojant parent:: raktinį žodį:

<?php

class ParentClass {
    protected $value = "tėvų reikšmė";

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

class ChildClass extends ParentClass {
    // Perrašyti savybę
    protected $value = "vaiko reikšmė";

    public function showValues() {
        // Kviečiame tėvų klasės metodą
        parent::showValue();
        // Išvedame vaiko klasės reikšmę
        echo $this->value . "\n";
    }
}

$obj = new ChildClass();
$obj->showValues();
// Išvestis:
// tėvų reikšmė
// vaiko reikšmė

?>

Prieigos modifikatoriai:

  • public: prieinama visur.
  • protected: prieinama klasės viduje ir paveldėtose klasėse.
  • private: prieinama tik klasės viduje.

Metodai gali būti pažymėti kaip final, kas uždraudžia jų perrašymą paveldėtose klasėse. Klasės taip pat gali būti final, kas uždraudžia jų paveldėjimą. Taip pat gali būti abstract, kas reikalauja jų įgyvendinimo paveldėtose klasėse.