Изолированные классы в C#

Изолированные классы используются для ограничения пользователей от наследования класса. Класс можно изолировать с помощью ключевого слова sealed . Ключевое слово сообщает компилятору, что класс изолирован и, следовательно, не может быть расширен. Никакой класс не может быть производным от изолированного класса.
Ниже приводится синтаксис изолированного класса:
Метод также можно изолировать, и в этом случае метод не может быть переопределен. Однако метод может быть изолирован в классах, в которых он унаследован. Если вы хотите объявить метод как изолированный, он должен быть объявлен как виртуальный в его базовом классе.
Следующий пример класса определяет изолированный класс в C#:
Далее создайте изолированный класс SealedClass и используйте его из `Program`.
Вывод :
Теперь, если попытаться унаследовать класс от изолированного класса, будет выдана ошибка, в которой говорится, что «Класс не может быть производным от изолированного класса .
Ошибка:
Ошибка CS0509 «Пример»: не может быть производным от изолированного типа «Тест»
Рассмотрим следующий пример изолированного метода в производном классе:
Вывод :
Объяснение: В приведенном выше коде C # класс Printer имеет блок отображения с размером 6 * 6, а класс LaserJet реализовал метод show , переопределив его так, чтобы он имел размер 12 * 12. Если какой-либо класс унаследует класс LaserJet , тогда он будет иметь такое же измерение 12 * 12 и не сможет реализовать собственное, т.е. он не может иметь 15 * 15, 16 * 16 или любые другие размеры. Таким образом, вызов LaserJet изолирует метод show , чтобы предотвратить его дальнейшее переопределение.
sealed (Справочник по C#)
При применении к классу модификатор sealed запрещает другим классам наследовать от этого класса. В следующем примере класс B наследует от класса A , но никакие классы не могут наследовать от класса B .
Модификатор sealed можно использовать для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе. Это позволяет классам наследовать от вашего класса, запрещая им при этом переопределять определенные виртуальные методы или свойства.
Пример
В следующем примере класс Z наследует от класса Y , но Z не может переопределить виртуальную функцию F , которая объявлена в классе X и запечатана в классе Y .
Чтобы предотвратить переопределение производных классов при определении новых методов или свойств, не назначайте их в качестве виртуальных (virtual).
Нельзя использовать модификатор abstract с запечатанным классом, поскольку абстрактный класс должен наследоваться классом, реализующим абстрактные методы или свойства.
При применении к методу или свойству модификатор sealed всегда следует использовать с sealed .
Поскольку структуры неявно запечатаны, их нельзя наследовать.
Дополнительные сведения см. в разделе Наследование.
Чтобы наследовать от запечатанного класса, можно применить следующую инструкцию в приведенном выше примере:
class MyDerivedC: SealedClass <> // Error
В результате выдается сообщение об ошибке:
‘MyDerivedC’: cannot derive from sealed type ‘SealedClass’
Комментарии
Чтобы определить, нужно ли запечатывать класс, метод или свойство, имейте в виду следующее:
потенциальные преимущества, которые производные классы могут получить от возможности настраивать ваш класс;
вероятность того, что производные классы могут корректировать ваши классы, препятствуя их нормальной работе.
Спецификация языка C#
Дополнительные сведения см. в спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
Как использовать (в чем смысл) sealed?
То есть в этом примере я конкретно показал, что наследование не возможно.
В первом примере это показано не настолько явно. Там модификатор sealed был применен к наследуемому классу B и говорилось, что уже от класса B наследование не возможно. То есть какой то третий класс не сможет наследоваться.
И далее идет ещё один пример. (Вот он третий класс Z.)
Обратите внимание, тут sealed идет в связке с override.
Как я понимаю — sealed — это запечатанный. То есть запечатанное не наследуется, не изменяется и т.д.
Поставили sealed — всё «броня». Никто не изменит, унаследует (за некоторыми исключениями и приемами).
Но вот этот код не верен
Свойство Field_1 не может быть запечатанным т.к. не содержит модификатора override.
Почему? Я не хочу чтобы моё свойство было замещено или переопределено.
Вот ещё мой пример
Аналогично. Говорит — ставь sealed к override. То есть я могу запретить переопределение свойства classB.
А в чем проблема у classA? Я хочу чтобы его свойство никто не переопределил. Ставлю sealed.
И стандартной ошибки — невозможно. т.к. запечатано не вижу.
Почему для запечатывания требуется override? Почему запечатывание свойства я могу применить только ко второму классу?
- Вопрос задан более года назад
- 2567 просмотров
- Вконтакте

- Вконтакте
Sealed переводится как «запечатанный, герметизированный». Запечатывается что именно?
1) Применение к объявлению класса. Первый пример показывает контекст применения ключевого слова. Функционал наследования запечатывается на первом же уровне наследования. В вашем контрпример не предоставляется новой информации для компилятора, поскольку на моменте компиляции компилятор сам может прийти к выводу, нужно ли при хранении объектов класса использовать указатель на таблицу виртуальных функций. Поэтому там слово sealed синтаксически верно, но лексически бесполезно.
2) Применение к объявлению члену класса. Запечатывание подразумевает наличие кое-чего, что можно запечатать. Именно — функционал наследования. Если вам нужно запечатать функционал наследования на каком-то уровне, вы это делаете. Если вы пытаетесь запечатать что-то на
уровне базового класса, то это в терминологии C# это невыражаемая мысль. Вы не должны использовать в таком случае наследование вообще (не объявлять virtual). Такую мысль могло бы выразить ключевое слово final (С++), но в C# его нет, в нём ООП используется немного в другом в контексте (где, грубо говоря, типы могут быть manged и unmanaged, и у программиста нет полного контроля над sizeof объектов типа).