запечатанный (справочник по 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#.