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


запечатанный (справочник по 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, объявленного в базовом типе, можно предотвратить переопределение типов с помощью запечатанных ключевых слов, как показано в следующем примере:

public sealed override string ToString() => Value;

Ошибка использования модификатора абстрактного с запечатанным классом, так как абстрактный класс должен наследоваться классом, предоставляющим реализацию абстрактных методов или свойств.

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

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

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

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

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

См. также