Книга: C# 4.0: полное руководство

Предотвращение наследования с помощью ключевого слова sealed

Предотвращение наследования с помощью ключевого слова sealed

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

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

Ниже приведен пример объявления класса типа sealed.

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

Как следует из комментариев в приведенном выше фрагменте кода, класс В не может наследовать класс А, потому что последний объявлен как sealed.

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

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

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

Оглавление книги


Генерация: 1.166. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз