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 Ypliku .

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#.

Zobacz też