sealed (dokumentacja C#)
W przypadku zastosowania do klasy modyfikator sealed
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 {}
Można również użyć modyfikatora 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 zezwalać klasom na dziedziczenie po Twojej klasie i zapobiegać zastępowaniu określonych wirtualnych metod lub właściwości.
Przykład
W poniższym przykładzie Z
dziedziczy z Y
, ale Z
nie może zastąpić F
funkcji wirtualnej zadeklarowanej w X
i zapieczętowanej w Y
.
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 wirtualnej.
Po zastąpieniu elementu członkowskiego virtual
zadeklarowanego w typie podstawowym, można zapobiec zastępowaniu go w typach pochodnych, używając słowa kluczowego sealed, jak w poniższym przykładzie:
public sealed override string ToString() => Value;
Jest to błąd podczas używania modyfikatora abstrakcyjnego z zapieczętowaną klasą, ponieważ klasa abstrakcyjna musi być dziedziczona przez klasę zapewniającą implementację metod abstrakcyjnych lub właściwości.
W przypadku stosowania do metody lub właściwości, modyfikator
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.
Możliwość, że klasy pochodne mogłyby zmodyfikować Twoje klasy w taki sposób, że przestałyby działać poprawnie lub zgodnie z oczekiwaniami.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zapoznaj się ze specyfikacją języka C#
Zobacz też
- Słowa kluczowe C#
- Klasy statyczne i statyczne składowe klasy
- klas abstrakcyjnych i zapieczętowanych oraz składowych klas
- modyfikatory dostępu
- modyfikatory
- przesłanianie
- wirtualny