Принцип замещения Лисков не может быть достигнут?

Приведите, пожалуйста, пример, в котором невозможно реализовать принцип "замещения Лисков"?

Спасибо.


person Smitha Reddy    schedule 05.08.2014    source источник
comment
Было бы полезно, если бы вы могли расширить контекст своего вопроса. Вы имеете в виду пример плохого кода, который нарушает LSP (то есть простой пример, демонстрирующий, почему этот принцип полезен), или вы ищете реальный сценарий? где сложно реализовать LSP?   -  person anotherdave    schedule 18.08.2014


Ответы (2)


Сценарий, в котором LSP предположительно не может быть достигнут, - это когда у вас могут быть два требования к классу A: (1) чтобы он наследовал от класса B или реализовывал интерфейс C и (2) чтобы он не предоставлял часть поведения, обеспечиваемого классом B или с которым интерфейс C свяжет его.

Пример класса, нарушающего принцип подстановки Лискова, можно найти в ReadOnlyCollection<T>, который реализует ICollection<T>, но не обеспечивает требуемое поведение Add или Remove. Ясно, что для ReadOnlyCollection<T> не имеет смысла разрешать добавление или удаление записей, но я подозреваю, что у него также были веские причины для реализации ICollection<T>.

person David Brower    schedule 15.08.2014

Предлагаем вам ознакомиться с проблемой кругового затмения.

По сути, LSP сложно реализовать, когда вы добавляете дополнительные условия к подтипам.

В случае круга дополнительным условием является то, что ширина должна быть равна высоте, но система, которая знает только о затмении суперкласса, рассчитывает иметь возможность изменять их независимо.

Обратите внимание, что это не проблема, если затмение не имеет сеттеров ширины или высоты. Поскольку система, использующая затмение, не может изменить их, круг не изменяет контракт затмения.

person weston    schedule 05.08.2014