Принцип открытости-закрытости относится к изменению кода или состоянию в рантайме
Что проверяют
Вопрос с подвохом на терминологию: не путаете ли вы принцип открытости-закрытости с неизменяемостью объекта. Многие вместо ответа на поставленный выбор начинают пересказывать SOLID целиком, и это само по себе ответ.
Как отвечать
Говорите прямо: речь про исходный код, а не про изменяемость состояния в рантайме. Закрыта для модификации означает, что ради новой функциональности не приходится править и перевыпускать уже работающий оттестированный класс. Открыта для расширения означает, что новое поведение добавляется новым кодом.
В C# расширение обычно даёт абстракция плюс подстановка реализации:
public interface IDiscount { decimal Apply(decimal sum); }
public sealed class OrderTotal(IEnumerable<IDiscount> discounts)
{
public decimal Calculate(decimal sum) =>
discounts.Aggregate(sum, (acc, d) => d.Apply(acc));
}Новая скидка это новый класс и строчка регистрации в контейнере, OrderTotal не трогаем. Другие механизмы того же рода: виртуальные методы, обобщения, методы расширения, делегат или стратегия, переданная в конструктор.
Полезно добавить два уточнения. Неизменяемость это соседняя тема: readonly, init-свойства и записи ограничивают изменение состояния, но к принципу отношения не имеют. И принцип не абсолютен: закрывать заранее каждую ось изменения означает получить интерфейс на каждый чих и абстракцию, которой никто не воспользуется.
Где спотыкаются
Отвечают, что верны оба варианта. Это уход от вопроса. У Мейера речь о модуле, который уже скомпилирован и используется другими модулями, про состояние объекта там нет ни слова.
Понимают запрет буквально, как «класс нельзя править вообще». Исправление бага это модификация, и она совершенно нормальна. Запрет касается добавления очередной разновидности поведения в тот же код.
Неверно называют признак нарушения. Смотреть надо на растущий switch по типу или флагу и на цепочки условий: каждая новая разновидность заставляет открывать один и тот же метод. При этом наследование ради наследования проблему не решает, чаще достаточно передать стратегию снаружи.