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