sealed (C#-Referenz)
Wenn sie auf eine Klasse angewendet wird, verhindert der sealed
Modifizierer, dass andere Klassen davon erben. Im folgenden Beispiel erbt die Klasse B
von der Klasse A
, aber keine Klasse kann von der Klasse B
erben.
class A {}
sealed class B : A {}
Sie können den Modifizierer sealed
auch auf eine Methode oder Eigenschaft anwenden, die eine virtuelle Methode oder Eigenschaft in einer Basisklasse außer Kraft setzt. Auf diese Weise können Sie zulassen, dass Klassen von Ihrer Klasse abgeleitet werden, und sie daran hindern, bestimmte virtuelle Methoden oder Eigenschaften außer Kraft zu setzen.
Beispiel
Im folgenden Beispiel erbt Z
von Y
, aber Z
kann die virtuelle Funktion F
, die in X
deklariert und in Y
versiegelt ist, nicht überschreiben.
class X
{
protected virtual void F() { Console.WriteLine("X.F"); }
protected virtual void F2() { Console.WriteLine("X.F2"); }
}
class Y : X
{
sealed protected override void F() { Console.WriteLine("Y.F"); }
protected override void F2() { Console.WriteLine("Y.F2"); }
}
class Z : Y
{
// Attempting to override F causes compiler error CS0239.
// protected override void F() { Console.WriteLine("Z.F"); }
// Overriding F2 is allowed.
protected override void F2() { Console.WriteLine("Z.F2"); }
}
Wenn Sie in einer Klasse neue Methoden oder Eigenschaften definieren, können Sie verhindern, dass abgeleitete Klassen diese überschreiben, indem Sie sie nicht als virtuelledeklarieren.
Wenn Sie einen in einem Basistyp deklarierten virtual
-Member überschreiben, können Sie verhindern, dass er von abgeleiteten Typen überschrieben wird, indem Sie das sealed-Schlüsselwort wie im folgenden Beispiel dargestellt verwenden:
public sealed override string ToString() => Value;
Es wäre ein Fehler, den Modifizierer abstract mit einer versiegelten Klasse zu verwenden, da eine abstrakte Klasse von einer Klasse geerbt werden muss, die eine Implementierung der abstrakten Methoden oder Eigenschaften bereitstellt.
Der Modifizierer sealed
muss immer mit override verwendet werden, wenn er auf eine Methode oder Eigenschaft angewendet wird.
Da Strukturen implizit versiegelt sind, können sie nicht geerbt werden.
Weitere Informationen finden Sie unter Vererbung.
Weitere Beispiele finden Sie unter Abstrakte und versiegelte Klassen und Klassenmember.
sealed class SealedClass
{
public int x;
public int y;
}
class SealedTest2
{
static void Main()
{
var sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine($"x = {sc.x}, y = {sc.y}");
}
}
// Output: x = 110, y = 150
Im vorherigen Beispiel können Sie mithilfe der folgenden Anweisung versuchen, von der versiegelten Klasse zu erben:
class MyDerivedC: SealedClass {} // Error
Das Ergebnis ist eine Fehlermeldung:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Hinweise
Um festzustellen, ob eine Klasse, Methode oder Eigenschaft versiegelt werden soll, sollten Sie in der Regel die folgenden beiden Punkte berücksichtigen:
Die potentiellen Vorteile, die ableitende Klassen durch die Möglichkeit, Ihre Klasse anzupassen, erhalten könnten
Die Möglichkeit, dass ableitende Klassen Ihre Klassen so ändern könnten, dass sie nicht mehr korrekt oder wie erwartet funktionieren
C#-Sprachspezifikation
Weitere Informationen finden Sie in der C#-Sprachspezifikation. Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.