Ответ
Чтобы полностью запретить наследование от класса, используется модификатор sealed.
Синтаксис:
public sealed class ApiResponse
{
public string Data { get; set; }
public int StatusCode { get; set; }
}
// Попытка наследования вызовет ошибку компиляции CS0509:
// 'DerivedResponse': cannot derive from sealed type 'ApiResponse'
public class DerivedResponse : ApiResponse { }
Зачем это нужно?
- Защита инвариантов и дизайна: Когда класс реализует специфичную логику, нарушаемую при наследовании (например, кэширование, синглтон, безопасность).
- Оптимизация производительности: Компилятор JIT может применять агрессивные оптимизации (девиртуализацию вызовов), зная, что метод не будет переопределен в производном классе.
- Контроль над иерархией: Явное указание, что класс является конечным в иерархии.
Частичное запрещение: Можно запретить переопределение отдельных методов в незапечатанном классе, используя sealed для метода.
public class PaymentProcessor
{
// Базовый виртуальный метод
public virtual void Validate() { /* общая логика */ }
}
public class CreditCardProcessor : PaymentProcessor
{
// Переопределяем и ЗАПЕЧАТЫВАЕМ метод.
// Дальнейшее переопределение в наследниках CreditCardProcessor будет невозможно.
public sealed override void Validate()
{
base.Validate();
// + специфичная проверка карты
}
}
public class PremiumCardProcessor : CreditCardProcessor
{
// Ошибка CS0239: нельзя переопределить запечатанный метод.
// public override void Validate() { }
}