В C # и C ++ / CLI ключевое слово sealed
(или NotInheritable
в VB) используется для защиты класса от любого шанса наследования (класс не наследуется). Я знаю, что одна из особенностей объектно-ориентированного программирования - это наследование, и я чувствую, что использование sealed
идет вразрез с этой функцией, она останавливает наследование. Есть ли пример, показывающий пользу sealed
и когда это важно использовать?
Дополнение к отличному ответу Бабуина :
В связи с этим, применимо только к незапечатанным классам: любой созданный метод
virtual
является точкой расширения или, по крайней мере, выглядит так, как будто он должен быть точкой расширения. Объявление методов такжеvirtual
должно быть осознанным решением. (В C # это осознанное решение; в Java - нет.)РЕДАКТИРОВАТЬ : некоторые соответствующие ссылки:
Также обратите внимание, что Kotlin по умолчанию закрывает классы; его
open
ключевое слово является противоположностью Javafinal
илиsealed
C # . (Безусловно, нет единого мнения, что это хорошо .)источник
Пометка класса как
Sealed
предотвращает вмешательство в важные классы, которые могут поставить под угрозу безопасность или повлиять на производительность.Во многих случаях изоляция класса также имеет смысл при разработке служебного класса с фиксированным поведением, которое мы не хотим изменять.
Например,
System
пространство имен вC#
предоставляет множество запечатанных классов, таких какString
. Если он не запечатан, его функциональность можно было бы расширить, что может быть нежелательно, поскольку это фундаментальный тип с заданной функциональностью.Точно так же
structures
inC#
всегда неявно запечатаны. Следовательно, нельзя вывести одну структуру / класс из другой структуры. Причина этого в том, чтоstructures
они используются для моделирования только автономных, атомарных, определяемых пользователем типов данных, которые мы не хотим изменять.Иногда, когда вы строите иерархию классов, вам может потребоваться ограничить определенную ветвь в цепочке наследования на основе модели предметной области или бизнес-правил.
Например, a
Manager
иPartTimeEmployee
обаEmployee
s, но у вас нет никакой роли после сотрудников, работающих неполный рабочий день, в вашей организации. В этом случае вы можете захотеть запечатать,PartTimeEmployee
чтобы предотвратить дальнейшее разветвление. С другой стороны, если у вас есть почасовые или еженедельные сотрудники, работающие неполный рабочий день, может иметь смысл унаследовать их отPartTimeEmployee
.источник
unseal
Позже, если потребуется, это легче сделать классу, чем запечатать его и сломать все классы, которые от него зависят.Я думаю, что в этом посте есть несколько хороших моментов, конкретный случай был при попытке привести незапечатанный класс к любому случайному интерфейсу, компилятор не выдает ошибку; но когда используется запечатанный, компилятор выдает ошибку, которую он не может преобразовать. Запечатанный класс обеспечивает дополнительную безопасность доступа кода.
https://www.codeproject.com/Articles/239939/Csharp-Tweaks-Why-to-use-the-sealed-keyword-on-cla
источник