Когда и почему вы должны запечатать класс?


в C# и C++/CLI ключевое слово sealed (или NotInheritable в VB) используется для защиты класса от любого шанса наследования (класс будет не наследуемым). Я знаю, что одной из особенностей объектно-ориентированного программирования является наследование, и я чувствую, что использование sealed идет против этой функции, она перестает наследования. Есть ли пример, который показывает преимущество sealed а когда это важно использовать?

3 63

3 ответа:

  1. в классе, который реализует функции безопасности, так что исходный объект не может быть "олицетворен".

  2. в более общем плане, я недавно обменялся с человеком в Microsoft, который сказал мне, что они пытались ограничить наследование до тех мест, где это действительно имело полный смысл, потому что оно становится дорогостоящим с точки зрения производительности, если его не лечить.
    ключевое слово sealed сообщает среде CLR, что ниже нет класса для поиска методов, и это ускоряет все встало.

в большинстве инструментов повышения производительности на рынке в настоящее время вы найдете флажок, который будет запечатывать все ваши классы, которые не наследуются.
Будьте осторожны, потому что, если вы хотите разрешить плагины или обнаружение сборки через MEF, вы столкнетесь с проблемами.

добавление к превосходному ответу бабуина:

  1. если класс не предназначен для наследования подклассы могут сломаться инварианты класс. Это действительно применимо только в том случае, если вы создаете публичный API, конечно, но, как я правило, я запечатываю любой класс, явно не предназначенный для подкласса.

на соответствующем примечании, применимом только к незапечатанным классам: любой метод создан virtual точка расширения, или, по крайней мере похоже, это должна быть точка расширения. Объявление методов virtual должно быть сознательное решение, а также. (В C# это сознательное решение; в Java это не так.)


EDIT: полезные ссылки:

также обратите внимание, что Котлин классы уплотнений по умолчанию;его open ключевое слово является противоположностью Java final или sealed на C#. (Конечно,нет всеобщего согласия, что это хорошо.)

Я думаю, что этот пост имеет некоторую хорошую точку, конкретный случай был при попытке привести незапечатанный класс к любому случайному интерфейсу, компилятор не выдает ошибку; но когда используется sealed компилятор выдает ошибку, которую он не может преобразовать. Запечатанный класс приносит дополнительный код доступа security.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla