← Все вопросы
Для чего нужно ключевое слово sealed в C#?
6
Встретил в чужом коде sealed class. Что делает sealed и зачем кому-то запрещать наследование от своего класса?
sealed class Logger { }
2 ответа
13
✓ Принятый ответ — помог автору
sealed (запечатанный) запрещает наследоваться от класса. Это противоположность возможности расширять класс.
sealed class Logger { }
// class FileLogger : Logger { } // ОШИБКА компиляции:
// нельзя наследоваться от sealed-класса
Зачем это нужно:
- Защита инварианта. Вы гарантируете, что поведение класса никто не переопределит и не сломает. Многие классы в .NET (например,
string) запечатаны намеренно. - Производительность. Вызовы методов sealed-класса JIT может девиртуализировать (вызвать напрямую, без таблицы виртуальных методов).
- Ясность намерения. Вы говорите: «этот класс — конечная точка, не строй на нём иерархию».
sealed можно применять и точечно — к отдельному переопределённому методу, чтобы запретить дальнейшее переопределение в потомках:
class Base { public virtual void Run() { } }
class Mid : Base { public sealed override void Run() { } }
class Low : Mid
{
// public override void Run() { } // ОШИБКА: метод запечатан
}
Общая рекомендация: если вы не проектировали класс под наследование, имеет смысл делать его sealed по умолчанию — это уменьшает поверхность для ошибок.
3
Просто как памятка соотношения с abstract:
abstract— класс обязан быть унаследован (сам по себе не создаётся).sealed— класс нельзя унаследовать (создаётся, но не расширяется).
Эти два модификатора взаимоисключающие: abstract sealed для класса не имеет смысла и не скомпилируется.
Ваш ответ
Войдите, чтобы ответить на вопрос.