Abstrakte und versiegelte Klassen und Klassenmember (C#-Programmierhandbuch)

Das Schlüsselwort abstract ermöglicht die Erstellung von Klassen und Klassenmembern, die unvollständig sind und in einer abgeleiteten Klasse implementiert werden müssen.

Mit dem Schlüsselwort sealed können Sie die Vererbung von Klassen oder bestimmten Klassenmembern unterbinden, die zuvor als virtuell gekennzeichnet wurden.

Abstrakte Klassen und Klassenmember

Klassen können durch Festlegen des Schlüsselworts abstract vor der Klassendefinition als abstrakt deklariert werden. Zum Beispiel:

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

Eine abstrakte Klasse darf nicht instanziiert werden. Der Zweck einer abstrakten Klasse ist die Bereitstellung einer allgemeinen Definition einer Basisklasse, die für mehrere abgeleitete Klassen freigegeben ist. Eine Klassenbibliothek kann beispielsweise eine abstrakte Klasse definieren, die als Parameter für ihre Funktionen verwendet wird. Programmierer, die diese Bibliothek verwenden, benötigen ihre eigene Implementierung der Klasse, die sie von ihr ableiten können.

Abstrakte Klassen können auch abstrakte Methoden definieren. Zu diesem Zweck wird das Schlüsselwort abstract vor dem Rückgabetyp der Methode einfügt. Zum Beispiel:

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

Abstrakte Methoden verfügen über keine Implementierung, deshalb folgt der Methodendefinition ein Semikolon statt eines normalen Methodenblocks. Von der abstrakten Klasse abgeleitete Klassen müssen alle abstrakten Methoden implementieren. Wenn eine abstrakte Klasse eine virtuelle Methode von einer Basisklasse erbt, kann sie die virtuelle Methode mit einer abstrakten Methode überschreiben. Zum Beispiel:

// 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.
    }
}

Wenn eine virtual-Methode als abstract deklariert ist, bleibt sie für alle Klassen virtuell, die von der abstrakten Klasse erben. Eine Klasse, die eine abstrakte Methode erbt, kann nicht auf die ursprüngliche Implementierung der Methode zugreifen. Im vorherigen Beispiel konnte DoWork auf Klasse F DoWork auf Klasse D nicht aufrufen. So kann eine abstrakte Klasse abgeleitete Klassen dazu zwingen, neue Methodenimplementierungen für virtuelle Methoden bereitzustellen.

Versiegelte Klassen und Klassenmember

Klassen können durch Festlegen des Schlüsselworts sealed vor der Klassendefinition als sealed deklariert werden. Zum Beispiel:

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

Eine versiegelte Klasse kann nicht als Basisklasse verwendet werden. Aus diesem Grund kann sie auch keine abstrakte Klasse sein. Von versiegelten Klassen kann nicht abgeleitet werden. Weil sie nicht als Basisklasse verwendet werden können, können Aufrufe an versiegelte Klassenmember durch Laufzeitoptimierungen etwas beschleunigt werden.

Methoden, Indexer, Eigenschaften oder Ereignisse einer abgeleiteten Klasse, die einen virtuellen Member der Basisklasse überschreiben, können diesen Member als versiegelt deklarieren. Damit wird der virtuelle Aspekt des Members für jede weitere abgeleitete Klasse aufgehoben. Dazu wird in die Klassenmemberdeklaration das Schlüsselwort sealed vor dem Schlüsselwort override eingefügt. Beispiel:

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

Weitere Informationen