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


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("X.F3"); }
    }
    class Z : Y
    {
        // Attempting to override F causes compiler error CS0239.
        // protected override void F() { Console.WriteLine("C.F"); }

        // Overriding F2 is allowed.
        protected override void F2() { Console.WriteLine("Z.F2"); }
    }

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

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

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

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

Дополнительные сведения см. в разделе Наследование (Руководство по программированию на C#).

Дополнительные примеры см. в разделе Абстрактные и запечатанные классы и члены классов (Руководство по программированию на C#).

    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

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

class MyDerivedC: SealedClass {} // Error

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

'MyDerivedC' cannot inherit from sealed class 'SealedClass'.

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

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

Заметки

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

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

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

См. также

Ссылки

Ключевые слова C#

Статические классы и члены статических классов (Руководство по программированию в C#)

Абстрактные и запечатанные классы и члены классов (Руководство по программированию на C#)

Модификаторы доступа (Руководство по программированию в C#)

Модификаторы (Справочник по C#)

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

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

Основные понятия

Руководство по программированию на C#

Другие ресурсы

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