Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Предотвращение наследования с помощью ключевого слова sealed C# Полное руководство Герберт Шилдт

Предотвращение наследования с помощью ключевого слова sealed C# Полное руководство Герберт Шилдт

Несмотря на всю эффективность и полезность наследования, иногда возникает потребность предотвратить его. Допустим, что имеется класс, инкапсулирующий последовательность инициализации некоторого специального оборудования, например медицинского монитора. В этом случае требуется, чтобы пользователи данного класса не могли изменять порядок инициализации монитора, чтобы исключить его неправильную настройку. Но независимо от конкретных причин в C# имеется возможность предотвратить наследование класса с помощью ключевого слова sealed.
Для того чтобы предотвратить наследование класса, достаточно указать ключевое слово sealed перед определением класса. Как и следовало ожидать, класс не допускается объявлять одновременно как abstract и sealed, поскольку сам абстрактный класс реализован не полностью и опирается в этом отношении на свои производные классы, обеспечивающие полную реализацию.
Ниже приведен пример объявления класса типа sealed.

sealed class А {
   // ...
}

// Следующий класс недопустим.
class В : А { // ОШИБКА! Наследовать класс А нельзя
   // ...
}


Как следует из комментариев в приведенном выше фрагменте кода, класс В не может наследовать класс А, потому что последний объявлен как sealed.
И еще одно замечание: ключевое слово sealed может быть также использовано в виртуальных методах для предотвращения их дальнейшего переопределения. Допустим, что имеется базовый класс В и производный класс D. Метод, объявленный в классе В как virtual, может быть объявлен в классе D как sealed. Благодаря этому в любом классе, наследующем от класса D, предотвращается переопределение данного метода. Подобная ситуация демонстрируется в приведенном ниже фрагменте кода.

class В {
   public virtual void MyMethod() { /* ... */ }
}

class D : В {
   // Здесь герметизируется метод MyMethod() и
   // предотвращается его дальнейшее переопределение.
   sealed public override void MyMethod() { /* ... */ }
   }
class X : D {
   // Ошибка! Метод MyMethod() герметизирован!
   public override void MyMethod() {/*...*/}

}


Метод MyMethod () герметизирован в классе D, и поэтому не может быть переопределен в классе X.