Udostępnij przez


sealed (dokumentacja C#)

sealed Zastosowanie modyfikatora do klasy uniemożliwia dziedziczenie innych klas z tej klasy. 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. Korzystając z tego podejścia, deweloperzy mogą uzyskiwać klasy z klasy, uniemożliwiając im zastępowanie określonych metod wirtualnych lub właściwości.

Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.

Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.

Wskazówka

Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.

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 wirtualnej. Po zastąpieniu virtual elementu członkowskiego zadeklarowanego w typie podstawowym można uniemożliwić zastępowanie typów pochodnych przy użyciu sealed słowa kluczowego, jak pokazano 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ę, która zapewnia implementację metod abstrakcyjnych lub właściwości.

Po zastosowaniu sealed modyfikatora do metody lub właściwości należy zawsze używać jej 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'

Aby określić, czy należy przypieczętować klasę, metodę lub właściwość, ogólnie należy wziąć pod uwagę następujące dwa punkty:

  • Potencjalne korzyści wynikające z wyprowadzania klas mogą uzyskać dzięki możliwości dostosowywania klasy.
  • Potencjał, że klasy pochodne mogą modyfikować klasy w taki sposób, aby nie działały 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ż