← Все вопросы

Для чего нужно ключевое слово sealed в C#?

Задан 31 месяц назад814 просмотров2 ответа
6

Встретил в чужом коде sealed class. Что делает sealed и зачем кому-то запрещать наследование от своего класса?

sealed class Logger { }

2 ответа

13
✓ Принятый ответ — помог автору

sealed (запечатанный) запрещает наследоваться от класса. Это противоположность возможности расширять класс.

sealed class Logger { }

// class FileLogger : Logger { } // ОШИБКА компиляции:
// нельзя наследоваться от sealed-класса

Зачем это нужно:

  1. Защита инварианта. Вы гарантируете, что поведение класса никто не переопределит и не сломает. Многие классы в .NET (например, string) запечатаны намеренно.
  2. Производительность. Вызовы методов sealed-класса JIT может девиртуализировать (вызвать напрямую, без таблицы виртуальных методов).
  3. Ясность намерения. Вы говорите: «этот класс — конечная точка, не строй на нём иерархию».

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 для класса не имеет смысла и не скомпилируется.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект