Sobes.tech
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 abstract en 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.