Когда и почему вы должны запечатать класс?
в C# и C++/CLI ключевое слово sealed
(или NotInheritable
в VB) используется для защиты класса от любого шанса наследования (класс будет не наследуемым). Я знаю, что одной из особенностей объектно-ориентированного программирования является наследование, и я чувствую, что использование sealed
идет против этой функции, она перестает наследования.
Есть ли пример, который показывает преимущество sealed
а когда это важно использовать?
3 ответа:
в классе, который реализует функции безопасности, так что исходный объект не может быть "олицетворен".
в более общем плане, я недавно обменялся с человеком в Microsoft, который сказал мне, что они пытались ограничить наследование до тех мест, где это действительно имело полный смысл, потому что оно становится дорогостоящим с точки зрения производительности, если его не лечить.
ключевое слово sealed сообщает среде CLR, что ниже нет класса для поиска методов, и это ускоряет все встало.в большинстве инструментов повышения производительности на рынке в настоящее время вы найдете флажок, который будет запечатывать все ваши классы, которые не наследуются.
Будьте осторожны, потому что, если вы хотите разрешить плагины или обнаружение сборки через MEF, вы столкнетесь с проблемами.
добавление к превосходному ответу бабуина:
- если класс не предназначен для наследования подклассы могут сломаться инварианты класс. Это действительно применимо только в том случае, если вы создаете публичный API, конечно, но, как я правило, я запечатываю любой класс, явно не предназначенный для подкласса.
на соответствующем примечании, применимом только к незапечатанным классам: любой метод создан
virtual
точка расширения, или, по крайней мере похоже, это должна быть точка расширения. Объявление методовvirtual
должно быть сознательное решение, а также. (В C# это сознательное решение; в Java это не так.)
EDIT: полезные ссылки:
- эффективная Java, 2-е издание Джошуа блох. См. пункт 17 (требуется подписка на Safari)
- эффективный Java пункт 17: дизайн и документ для наследования или же запретить его (обсуждение того же пункта)
также обратите внимание, что Котлин классы уплотнений по умолчанию;его
open
ключевое слово является противоположностью Javafinal
илиsealed
на C#. (Конечно,нет всеобщего согласия, что это хорошо.)
Я думаю, что этот пост имеет некоторую хорошую точку, конкретный случай был при попытке привести незапечатанный класс к любому случайному интерфейсу, компилятор не выдает ошибку; но когда используется sealed компилятор выдает ошибку, которую он не может преобразовать. Запечатанный класс приносит дополнительный код доступа security.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla