вопрос идентифицировать из-за следующие несовместимые особенности модели.
- Все птицы могут летать
- Утки птица
- Уток не могут летать
Вам нужно изменить один из них, чтобы сделать заявление последовательно. Что изменится, будет как вопрос наиболее подходящего дизайна для вашего использования, так и проблемы, связанные с внесением изменений.
Вы можете обратиться к этому, представив классы, позволяющие отличать летающих и нелетающих птиц. Возможно, чтобы сделать изменение меньше, ваш класс птиц продолжает летать, и поэтому Утка - не птица, а беглеца. Или, может быть, вы расширяете птиц, чтобы создать класс летающих птиц, и переместите туда метод летания - оба будут связаны с изменениями существующего кода.
Бросание исключений - это вид мошенничества в точке 3 - ваша утка все еще не летает, это просто создает проблему во время выполнения, а не во время разработки. Это может быть быстро, но это не очень безопасный подход, и он требует вызова кода, избегая вызова летать на птиц, которые, случается, утки.
Независимо от того, разрешаете ли вы совершать полеты для уток, все в порядке, зависит от того, что ваш кодовый код ожидает от летать вообще, - в действительности вы исправляете несогласованность, изменяя значение мухи в пункте 1 на «Все птицы могут быть заданы летать (хотя некоторые не будут) ». В этом случае fly действительно становится flyIfyouCan, который может быть признаком несовершенного дизайна, но может быть прагматичным решением, особенно при адаптации существующего дизайна.
Тот факт, что вы предлагаете вариант «ничего не делать», может указывать на маршрут до наименьшего волнения, потому что если вы позволили лету ничего не делать для уток, вам все равно понадобится какой-то утиный код, чтобы он плавал, чтобы вы могли согласитесь, что в реальном мире утки могут летать, а утка-специфический кодовый вызов плавать, а не летать - не так хорошо, как летать.
В общем, я думаю, что вы на самом деле описываете изменение точки 1, поскольку «все птицы могут летать», чтобы «все птицы могли двигаться», а затем не-утки реализуют движение, поскольку муха и утки реализуют движение как плавание (есть ли у них также метод мух или нет). Это, вероятно, связано с изменением некоторых существующих звонков, чтобы летать на вызовы для перемещения.
Не совсем нарушение ЛСД. Дегенерированная реализация является лишь признаком нарушения ЛСД. Вы должны рассмотреть контракт своего метода fly(). На что повлияет клиент, когда муха() утки ничего не делает? – Kata
Этот вопрос похож на знаменитый треугольник и квадратную проблему. Я думаю, что утка не должна быть подтипом птицы. – shreesha
Не является нарушением LSP, если вы не делаете исключение в 'duck.fly()' или вы нарушаете некоторые постусловия этого метода или инварианты класса 'Bird' (которые нелегко угадать в таком надуманном примере) – guillaume31