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

При применении к классу модификатор sealed запрещает другим классам наследовать от этого класса.When applied to a class, the sealed modifier prevents other classes from inheriting from it. В следующем примере класс B наследует от класса A, но никакие классы не могут наследовать от класса B.In the following example, class B inherits from class A, but no class can inherit from class B.

class A {}
sealed class B : A {}

Модификатор sealed можно использовать для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе.You can also use the sealed modifier on a method or property that overrides a virtual method or property in a base class. Это позволяет классам наследовать от вашего класса, запрещая им при этом переопределять определенные виртуальные методы или свойства.This enables you to allow classes to derive from your class and prevent them from overriding specific virtual methods or properties.

ПримерExample

В следующем примере класс Z наследует от класса Y, но Z не может переопределить виртуальную функцию F, которая объявлена в классе X и запечатана в классе Y.In the following example, Z inherits from Y but Z cannot override the virtual function F that is declared in X and sealed in 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).When you define new methods or properties in a class, you can prevent deriving classes from overriding them by not declaring them as virtual.

Нельзя использовать модификатор abstract с запечатанным классом, поскольку абстрактный класс должен наследоваться классом, реализующим абстрактные методы или свойства.It is an error to use the abstract modifier with a sealed class, because an abstract class must be inherited by a class that provides an implementation of the abstract methods or properties.

При применении к методу или свойству модификатор sealed всегда следует использовать с override.When applied to a method or property, the sealed modifier must always be used with override.

Поскольку структуры неявно запечатаны, их нельзя наследовать.Because structs are implicitly sealed, they cannot be inherited.

Дополнительные сведения см. в разделе Наследование.For more information, see Inheritance.

Дополнительные примеры см. в разделе Абстрактные и запечатанные классы и члены классов.For more examples, see Abstract and Sealed Classes and Class Members.

ПримерExample

sealed class SealedClass
{
    public int x;
    public int y;
}

class SealedTest2
{
    static void Main()
    {
        SealedClass sc = new SealedClass();
        sc.x = 110;
        sc.y = 150;
        Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
    }
}
// Output: x = 110, y = 150

Чтобы наследовать от запечатанного класса, можно применить следующую инструкцию в приведенном выше примере:In the previous example, you might try to inherit from the sealed class by using the following statement:

class MyDerivedC: SealedClass {} // Error

В результате выдается сообщение об ошибке:The result is an error message:

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

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

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

ПримечанияRemarks

Чтобы определить, нужно ли запечатывать класс, метод или свойство, имейте в виду следующее:To determine whether to seal a class, method, or property, you should generally consider the following two points:

  • потенциальные преимущества, которые производные классы могут получить от возможности настраивать ваш класс;The potential benefits that deriving classes might gain through the ability to customize your class.

  • вероятность того, что производные классы могут корректировать ваши классы, препятствуя их нормальной работе.The potential that deriving classes could modify your classes in such a way that they would no longer work correctly or as expected.

См. такжеSee also