Poți vorbi despre principiile de moștenire în programarea orientată pe obiecte?
sobes.tech AI
Răspuns de la AI
Moștenirea permite crearea unei clase noi (clasă fiică sau derivată), bazată pe o clasă existentă (părinte, de bază sau superclasă). Clasa fiică moștenește proprietățile (atributele) și metodele clasei părinte și poate adăuga propriile sau poate suprascrie cele moștenite.
Concepte principale:
- Extinderea funcționalității: Moștenind de la clasa părinte, clasa fiică primește funcționalitatea de bază și o poate extinde adăugând metode sau proprietăți noi.
- Suprascrierea metodelor: Clasa fiică poate modifica comportamentul unei metode moștenite de la clasa părinte creând o metodă cu același nume (polimorfism).
- Reutilizarea codului: Permite evitarea duplicării codului, deoarece logica comună este definită în clasa părinte.
- Raportul "este": Moștenirea modelează raportul "este un" (is-a). De exemplu, "Un pisică este un animal".
<?php
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "Sunet necunoscut\n";
}
}
class Dog extends Animal {
public function speak() {
echo "Ham-ham!\n";
}
}
class Cat extends Animal {
public function speak() {
echo "Miau-miau!\n";
}
}
$dog = new Dog("Bobby");
$dog->speak(); // Ieșire: Ham-ham!
$cat = new Cat("Murka");
$cat->speak(); // Ieșire: Miau-miau!
?>
În PHP, moștenirea se realizează cu cuvântul cheie extends. O clasă poate moșteni doar de la o singură clasă (moștenire simplă), dar poate implementa multiple interfețe.
Accesul la proprietățile și metodele clasei părinte din clasa fiică este posibil folosind cuvântul cheie parent::.
<?php
class ParentClass {
protected $value = "valoare părinte";
public function showValue() {
echo $this->value . "\n";
}
}
class ChildClass extends ParentClass {
// Suprascrierea proprietății
protected $value = "valoare copil";
public function showValues() {
// Apelarea metodei clasei părinte
parent::showValue();
// Afișarea valorii clasei copil
echo $this->value . "\n";
}
}
$obj = new ChildClass();
$obj->showValues();
// Ieșire:
// valoare părinte
// valoare copil
?>
Modificatori de acces principali:
public: Disponibil peste tot.protected: Disponibil în interiorul clasei și în clasele moștenitoare.private: Disponibil doar în interiorul clasei.
Metodele pot fi declarate final, ceea ce le împiedică să fie suprascrise în clasele moștenitoare. Clasele pot fi, de asemenea, final, ceea ce împiedică moștenirea lor. Pot fi abstract, ceea ce necesită implementarea lor în clasele moștenitoare.