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


Запечатывание

Примечание.

Это содержимое перепечатывается разрешением Pearson Education, Inc. из руководства по проектированию платформы: соглашения, идиомы и шаблоны для повторно используемых библиотек .NET, 2-го выпуска. Этот выпуск был опубликован в 2008 году, и книга с тех пор была полностью пересмотрена в третьем выпуске. Некоторые сведения на этой странице могут быть устаревшими.

Одна из возможностей объектно-ориентированных платформ состоит в том, что разработчики могут расширять и настраивать их способами, не предусмотренными конструкторами платформы. В этом заключается как мощь, так и опасность расширяемого проектирования. Поэтому при разработке платформы очень важно тщательно проектировать расширяемость, когда она необходима, и ограничивать ее, когда она может быть опасна.

Эффективным механизмом, который предотвращает расширяемость, является запечатывание. Вы можете запечатать класс или отдельные элементы. При запечатывании класса пользователи не смогут наследовать от него. При запечатывании элемента пользователи не смогут переопределять конкретный элемент.

❌ Не запечатывайте классы без веской на то причины.

Запечатывание класса из-за невозможности придумать сценарий расширяемости не является веской причиной. Пользователи платформы любят наследовать от классов по различным неявным причинам, например добавление удобных элементов. Примеры неявных причин, по которым пользователи хотят наследовать от типа, см . в неуправляемых классах .

Ниже приведены веские причины для запечатывания класса.

  • Класс является статическим. См. статью Разработка статических классов.

  • В наследуемых защищенных элементах класса хранятся важные для обеспечения безопасности секреты.

  • Класс наследует множество виртуальных элементов, и запечатать их по отдельности может быть выгоднее, чем оставить класс незапечатанным.

  • Класс является атрибутом, для которого требуется очень быстро выполнять поиск в среде выполнения. Уровни производительности у запечатанных атрибутов чуть выше, чем у незапечатанных. См. статью Атрибуты.

❌ НЕ объявляйте защищенные или виртуальные элементы в запечатанных типах.

По определению наследовать запечатанные типы невозможно. Это означает, что защищенные элементы для запечатанных типов невозможно вызвать, а виртуальные методы для запечатанных типов невозможно перезаписать.

✔️ РАССМОТРИТЕ возможность запечатывания элементов, которые планируете переопределить.

Проблемы, которые могут возникнуть в результате введения виртуальных элементов (рассматриваются в статье Виртуальные элементы), касаются и переопределений, хоть и в немного меньшей степени. Запечатывание переопределения обеспечивает защиту от этих проблем, начиная с этой точки в иерархии наследования.

Фрагменты: © Корпорация Майкрософт (Microsoft Corporation), 2005, 2009. Все права защищены.

Перепечатано с разрешения Pearson Education, Inc. из книги Инфраструктура программных проектов. Соглашения, идиомы и шаблоны для многократно используемых библиотек .NET (2-е издание), авторы: Кржиштоф Цвалина (Krzysztof Cwalina) и Брэд Абрамс (Brad Abrams). Книга опубликована 22 октября 2008 г. издательством Addison-Wesley Professional в рамках серии, посвященной разработке для Microsoft Windows.

См. также