Поделиться через


sealed (Справочник по C#)

При применении к классу модификатор sealed запрещает другим классам наследовать от этого класса. В следующем примере класс B наследует от класса A, но никакие классы не могут наследовать от класса B.

class A {}
sealed class B : A {}

Модификатор sealed можно использовать для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе. Это позволяет классам наследовать от вашего класса, запрещая им при этом переопределять определенные виртуальные методы или свойства.

Пример

В следующем примере класс Z наследует от класса Y, но Z не может переопределить виртуальную функцию F, которая объявлена в классе X и запечатана в классе 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"); }
}

Чтобы предотвратить переопределение производных классов при определении новых методов или свойств, не назначайте их в качестве виртуальных (virtual).

Нельзя использовать модификатор abstract с запечатанным классом, поскольку абстрактный класс должен наследоваться классом, реализующим абстрактные методы или свойства.

При применении к методу или свойству модификатор sealed всегда следует использовать с override.

Поскольку структуры неявно запечатаны, их нельзя наследовать.

Дополнительные сведения см. в разделе Наследование.

Дополнительные примеры см. в разделе Абстрактные и запечатанные классы и члены классов.

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

Чтобы наследовать от запечатанного класса, можно применить следующую инструкцию в приведенном выше примере:

class MyDerivedC: SealedClass {} // Error

В результате выдается сообщение об ошибке:

'MyDerivedC': cannot derive from sealed type 'SealedClass'

Замечания

Чтобы определить, нужно ли запечатывать класс, метод или свойство, имейте в виду следующее:

  • потенциальные преимущества, которые производные классы могут получить от возможности настраивать ваш класс;

  • вероятность того, что производные классы могут корректировать ваши классы, препятствуя их нормальной работе.

Спецификация языка C#

Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также