Kun je vertellen over de principes van overerving in objectgeoriënteerd programmeren?
sobes.tech AI
Antwoord van AI
Overerving maakt het mogelijk om een nieuwe klasse (afgeleid of subklasse) te maken, gebaseerd op een bestaande klasse (ouder, basisklasse of superklasse). De afgeleide klasse erft eigenschappen (attributen) en methoden van de ouderklasse, en kan ook eigen eigenschappen toevoegen of de geërfde overschrijven.
Belangrijke concepten:
- Uitbreiding van functionaliteit: Door te erven van de ouderklasse krijgt de afgeleide klasse basisfunctionaliteit en kan deze uitbreiden door nieuwe methoden of eigenschappen toe te voegen.
- Methoden overschrijven: De afgeleide klasse kan het gedrag van een geërfde methode van de ouderklasse wijzigen door een methode met dezelfde naam te maken (polymorfisme).
- Herbruik van code: Vermijdt duplicatie van code, omdat de gemeenschappelijke logica in de ouderklasse wordt gedefinieerd.
- "Is een"-relatie: Overerving modelleert de relatie "is een" (is-a). Bijvoorbeeld: "Een kat is een dier".
<?php
class Animal {
protected $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
echo "Onbekend geluid\n";
}
}
class Dog extends Animal {
public function speak() {
echo "Woef-woef!\n";
}
}
class Cat extends Animal {
public function speak() {
echo "Miauw-miauw!\n";
}
}
$dog = new Dog("Bobby");
$dog->speak(); // Uitvoer: Woef-woef!
$cat = new Cat("Murka");
$cat->speak(); // Uitvoer: Miauw-miauw!
?>
In PHP wordt overerving gedaan met het sleutelwoord extends. Een klasse kan slechts van één klasse erven (enkelvoudige overerving), maar kan meerdere interfaces implementeren.
Toegang tot eigenschappen en methoden van de ouderklasse vanuit de afgeleide klasse is mogelijk met parent::.
<?php
class ParentClass {
protected $value = "ouderwaarde";
public function showValue() {
echo $this->value . "\n";
}
}
class ChildClass extends ParentClass {
// Overschrijven van de eigenschap
protected $value = "kindwaarde";
public function showValues() {
// Aanroep van de methode van de ouderklasse
parent::showValue();
// Weergave van de waarde van de kindklasse
echo $this->value . "\n";
}
}
$obj = new ChildClass();
$obj->showValues();
// Uitvoer:
// ouderwaarde
// kindwaarde
?>
Belangrijke toegangsmodificatoren:
public: Toegankelijk overal.protected: Toegankelijk binnen de klasse en in afgeleide klassen.private: Alleen binnen de klasse toegankelijk.
Methoden kunnen final worden verklaard, wat hun overschrijven in afgeleide klassen verbiedt. Klassen kunnen ook final zijn, wat hun overerving verbiedt. Ze kunnen abstract zijn, wat hun implementatie in afgeleide klassen vereist.