Junior
Wat is de essentie van een abstracte klasse?
sobes.tech AI
Antwoord van AI
Het doel van een abstracte klasse is om te dienen als sjabloon voor andere klassen. Het kan niet direct worden aangemaakt, maar kan abstracte methoden (zonder lichaam) bevatten die geïmplementeerd moeten worden in de afgeleide klassen, evenals concrete methoden en eigenschappen.
Belangrijke punten:
- Kan geen instantie worden gemaakt:
new AbstracteKlasse()zal een fout veroorzaken. - Overerving: Alleen van een abstracte klasse erven (
extends). - Abstracte methoden: Definiëren de interface die door de afgeleide klassen moet worden geïmplementeerd. Worden gemarkeerd met het sleutelwoord
abstracten hebben geen lichaam. - Concrete methoden en eigenschappen: Kunnen direct worden gedefinieerd en gebruikt, en kunnen worden overschreven in de afgeleide klassen.
- Gedeeltelijke implementatie: Biedt een algemene structuur en enige basisfunctionaliteit, waarbij de details van de implementatie aan de afgeleide klassen worden overgelaten.
Voorbeeld:
<?php
abstract class Vorm {
protected $kleur;
public function __construct($kleur) {
$this->kleur = $kleur;
}
abstract public function berekenOppervlakte(); // Abstracte methode
public function krijgKleur() {
return $this->kleur;
}
}
class Cirkel extends Vorm {
private $straal;
public function __construct($kleur, $straal) {
parent::__construct($kleur);
$this->straal = $straal;
}
public function berekenOppervlakte() {
return pi() * $this->straal * $this->straal;
}
}
class Vierkant extends Vorm {
private $zijde;
public function __construct($kleur, $zijde) {
parent::__construct($kleur);
$this->zijde = $zijde;
}
public function berekenOppervlakte() {
return $this->zijde * $this->zijde;
}
}
// Voorbeeldgebruik
$cirkel = new Cirkel("Rood", 5);
echo "Oppervlakte van de cirkel: " . $cirkel->berekenOppervlakte() . ", Kleur: " . $cirkel->krijgKleur() . "\n";
$vierkant = new Vierkant("Blauw", 4);
echo "Oppervlakte van het vierkant: " . $vierkant->berekenOppervlakte() . ", Kleur: " . $vierkant->krijgKleur() . "\n";
// De volgende code veroorzaakt een fatale fout: instantie van een abstracte klasse
// $abstracteVorm = new Vorm("Onbekend");
Vergelijkingstabel met interfaces en gewone klassen:
| Kenmerk | Abstracte klasse | Interface | Gewone klasse |
|---|---|---|---|
| Instantie maken | Nee | Nee | Ja |
| Overerving | Ja (extends) + Implementatie (implements) |
Alleen Implementatie (implements) |
Ja (extends) |
| Methoden | Concrete en abstracte methoden | Alleen abstract (zonder lichaam) | Alleen concreet |
| Eigenschappen | Ja | Nee | Ja |
| Meervoudige overerving | Nee | Ja | Nee |
| Gebruik | Gedeeltelijke implementatie, algemene structuur | Contractdefinitie (gedrag) | Volledige implementatie, concreet object |
Gebruikt wanneer er algemene logica en eigenschappen zijn die bij een groep gerelateerde klassen moeten horen, maar waarvan het specifieke gedrag (de implementatie van sommige methoden) varieert. Het zorgt voor hergebruik van code en uniformiteit in de structuur van de klassen.