Abstracte en verzegelde klassen en klasleden (C#-programmeerhandleiding)

Met het abstracte trefwoord kunt u klassen en klasseleden maken die onvolledig zijn en moeten worden geïmplementeerd in een afgeleide klasse.

Met het verzegelde trefwoord kunt u de overname van een klasse of bepaalde klasseleden die eerder als virtueel zijn gemarkeerd, voorkomen.

Abstracte klassen en klasleden

Klassen kunnen worden gedeclareerd als abstract door het trefwoord abstract vóór de klassedefinitie te plaatsen. Voorbeeld:

public abstract class A
{
    // Class members here.
}

Een abstracte klasse kan niet worden geïnstantieerd. Het doel van een abstracte klasse is om een gemeenschappelijke definitie te bieden van een basisklasse die meerdere afgeleide klassen kunnen delen. Een klassebibliotheek kan bijvoorbeeld een abstracte klasse definiëren die wordt gebruikt als een parameter voor veel functies en programmeurs die deze bibliotheek gebruiken om hun eigen implementatie van de klasse te bieden door een afgeleide klasse te maken.

Abstracte klassen kunnen ook abstracte methoden definiëren. Dit wordt bereikt door het trefwoord abstract toe te voegen vóór het retourtype van de methode. Voorbeeld:

public abstract class A
{
    public abstract void DoWork(int i);
}

Abstracte methoden hebben geen implementatie, dus de methodedefinitie wordt gevolgd door een puntkomma in plaats van een normaal methodeblok. Afgeleide klassen van de abstracte klasse moeten alle abstracte methoden implementeren. Wanneer een abstracte klasse een virtuele methode overschrijft van een basisklasse, kan de abstracte klasse de virtuele methode overschrijven met een abstracte methode. Voorbeeld:

// compile with: -target:library
public class D
{
    public virtual void DoWork(int i)
    {
        // Original implementation.
    }
}

public abstract class E : D
{
    public abstract override void DoWork(int i);
}

public class F : E
{
    public override void DoWork(int i)
    {
        // New implementation.
    }
}

Als een virtual methode wordt gedeclareerd abstract, is deze nog steeds virtueel voor elke klasse die wordt overgenomen van de abstracte klasse. Een klasse die een abstracte methode over neemt, heeft geen toegang tot de oorspronkelijke implementatie van de methode. In het vorige voorbeeld DoWork kan klasse F geen aanroep DoWork uitvoeren op klasse D. Op deze manier kan een abstracte klasse afgeleide klassen dwingen om nieuwe methode-implementaties te bieden voor virtuele methoden.

Verzegelde klassen en klasleden

Klassen kunnen worden gedeclareerd als verzegeld door het trefwoord sealed vóór de klassedefinitie te plaatsen. Voorbeeld:

public sealed class D
{
    // Class members here.
}

Een verzegelde klasse kan niet worden gebruikt als basisklasse. Daarom kan het geen abstracte klasse zijn. Verzegelde klassen verhinderen afleiding. Omdat ze nooit kunnen worden gebruikt als basisklasse, kunnen sommige runtime-optimalisaties ervoor zorgen dat verzegelde klasseleden iets sneller worden aangeroepen.

Een methode, indexeerfunctie, eigenschap of gebeurtenis, op een afgeleide klasse die een virtueel lid van de basisklasse overschrijft, kan dat lid declareren als verzegeld. Dit onderhandelt het virtuele aspect van het lid voor elke verdere afgeleide klasse. Dit wordt bereikt door het trefwoord vóór het sealedonderdrukkingswoord in de declaratie van het klasselid te plaatsen. Bijvoorbeeld:

public class D : C
{
    public sealed override void DoWork() { }
}

Zie ook