sealed (odwołanie w C#)
W przypadku zastosowania do klasy sealed
modyfikator uniemożliwia dziedziczenie z niej innych klas. W poniższym przykładzie klasa B
dziedziczy z klasy A
, ale żadna klasa nie może dziedziczyć z klasy B
.
class A {}
sealed class B : A {}
Modyfikator można również użyć sealed
w metodzie lub właściwości, która zastępuje metodę wirtualną lub właściwość w klasie bazowej. Dzięki temu można zezwolić klasom na korzystanie z klasy i zapobiegać zastępowaniu określonych metod wirtualnych lub właściwości.
Przykład
W poniższym przykładzie Z
dziedziczy element , Y
ale Z
nie może zastąpić funkcji F
wirtualnej zadeklarowanej w X
pliku i zapieczętowanej w Y
pliku .
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"); }
}
Podczas definiowania nowych metod lub właściwości w klasie można uniemożliwić zastępowanie klas pochodnych, nie deklarując ich jako wirtualne.
Jest to błąd użycia modyfikatora abstrakcyjnego z zapieczętowaną klasą, ponieważ klasa abstrakcyjna musi być dziedziczona przez klasę, która zapewnia implementację metod abstrakcyjnych lub właściwości.
W przypadku zastosowania do metody lub właściwości sealed
modyfikator musi być zawsze używany z przesłonięć.
Ponieważ struktury są niejawnie zapieczętowane, nie można ich dziedziczyć.
Aby uzyskać więcej informacji, zobacz Dziedziczenie.
Aby uzyskać więcej przykładów, zobacz Klasy abstrakcyjne i zapieczętowane oraz składowe klas.
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
W poprzednim przykładzie można spróbować dziedziczyć z zapieczętowanej klasy przy użyciu następującej instrukcji:
class MyDerivedC: SealedClass {} // Error
Wynik jest komunikatem o błędzie:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Uwagi
Aby określić, czy należy przypieczętować klasę, metodę lub właściwość, należy ogólnie rozważyć następujące dwa punkty:
Potencjalne korzyści wynikające z wyprowadzania klas mogą uzyskać dzięki możliwości dostosowywania klasy.
Potencjał wyprowadzania klas może zmodyfikować klasy w taki sposób, aby nie działały poprawnie lub zgodnie z oczekiwaniami.
specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.