Udostępnij za pośrednictwem


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 musi być zawsze używany z przesłonięciemza pomocą .

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#. Specyfikacja języka jest ostatecznym źródłem składni i użycia języka C#.

Zobacz też