Freigeben über


Abstrakte und abgedichtete Klassen und Klassenmitglieder (C#-Programmierhandbuch)

Mit dem abstrakten Schlüsselwort können Sie Klassen und Klassenmember erstellen, die unvollständig sind und in einer abgeleiteten Klasse implementiert werden müssen.

Mit dem versiegelten Schlüsselwort können Sie die Vererbung einer Klasse oder bestimmter Klassenmember verhindern, die zuvor als virtuell gekennzeichnet wurden.

Abstrakte Klassen und Klassenmitglieder

Klassen können als abstrakt deklariert werden, indem das Schlüsselwort abstract vor der Klassendefinition eingefügt wird. Beispiel:

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

Eine abstrakte Klasse kann nicht instanziiert werden. Der Zweck einer abstrakten Klasse besteht darin, eine gemeinsame Definition einer Basisklasse bereitzustellen, die von mehreren abgeleiteten Klassen gemeinsam verwendet werden kann. Eine Klassenbibliothek kann beispielsweise eine abstrakte Klasse definieren, die als Parameter für viele ihrer Funktionen verwendet wird, und verlangt von Programmierern, die diese Bibliothek nutzen, ihre eigene Implementierung der Klasse bereitzustellen, indem sie eine abgeleitete Klasse erstellen.

Abstrakte Klassen können auch abstrakte Methoden definieren. Dazu fügen Sie das Schlüsselwort abstract vor dem Rückgabetyp der Methode hinzu. Beispiel:

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

Abstrakte Methoden haben keine Implementierung, daher folgt die Methodendefinition einem Semikolon anstelle eines normalen Methodenblocks. Abgeleitete Klassen der abstrakten Klasse müssen alle abstrakten Methoden implementieren. Wenn eine abstrakte Klasse eine virtuelle Methode von einer Basisklasse erbt, kann die abstrakte Klasse die virtuelle Methode mit einer abstrakten Methode überschreiben. 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 deklariert abstractwird, ist sie für jede Klasse, die von der abstrakten Klasse erbt, noch virtuell. 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 Klassenmitglieder

Klassen können als versiegelt deklariert werden, indem das Schlüsselwort sealed vor der Klassendefinition eingefügt wird. Beispiel:

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

Eine versiegelte Klasse kann nicht als Basisklasse verwendet werden. Aus diesem Grund kann es sich nicht auch um eine abstrakte Klasse handeln. Versiegelte Klassen verhindern die Ableitung. Da sie niemals als Basisklasse verwendet werden können, können einige Laufzeitoptimierungen das Aufrufen versiegelter Klassenmember etwas schneller machen.

Eine Methode, ein Indexer, eine Eigenschaft oder ein Ereignis für eine abgeleitete Klasse, die ein virtuelles Element der Basisklasse überschreibt, kann dieses Element als versiegelt deklarieren. Dadurch wird der virtuelle Aspekt des Elements für jede weitere abgeleitete Klasse negiert. Dazu wird das sealed Schlüsselwort vor dem override-Schlüsselwort in der Klassenmitglieddeklaration platziert. Beispiel:

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

Siehe auch