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


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

Замечание

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

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

Мощный механизм, который предотвращает расширяемость, — это запечатывание. Можно запечатывать класс или отдельные члены. Запечатывание класса предотвращает наследование пользователей от класса. Запечатывание элемента запрещает пользователям переопределять определенный элемент.

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

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

Хорошими причинами для закрытия класса включают следующее:

  • Класс является статическим классом. См. структуру статических классов.

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

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

  • Класс — это атрибут, который требует очень быстрого поиска во время выполнения. Запечатанные атрибуты имеют несколько более высокие уровни производительности, чем незапечатанные. См. атрибуты.

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

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

✔️ Рассмотрите возможность закрытия членов, которые вы переопределяете.

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

© Часть 2005, 2009 Корпорация Майкрософт. Все права защищены.

Перепечатан с разрешения Pearson Education, Inc. из Руководство по проектированию: Соглашения, идиомы и шаблоны для повторного использования библиотек .NET, 2-е издание Кшиштоф Чвалина и Брэд Абрамс, опубликованное 22 октября 2008 года Addison-Wesley Профессиональный в рамках серии разработки Microsoft Windows.

См. также