Как в C# запретить наследование от класса?

«Как в C# запретить наследование от класса?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы полностью запретить наследование от класса, используется модификатор 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 { }

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

  1. Защита инвариантов и дизайна: Когда класс реализует специфичную логику, нарушаемую при наследовании (например, кэширование, синглтон, безопасность).
  2. Оптимизация производительности: Компилятор JIT может применять агрессивные оптимизации (девиртуализацию вызовов), зная, что метод не будет переопределен в производном классе.
  3. Контроль над иерархией: Явное указание, что класс является конечным в иерархии.

Частичное запрещение: Можно запретить переопределение отдельных методов в незапечатанном классе, используя 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() { }
}