Приведите, пожалуйста, пример, в котором невозможно реализовать принцип "замещения Лисков"?
Спасибо.
Приведите, пожалуйста, пример, в котором невозможно реализовать принцип "замещения Лисков"?
Спасибо.
Сценарий, в котором LSP предположительно не может быть достигнут, - это когда у вас могут быть два требования к классу A: (1) чтобы он наследовал от класса B или реализовывал интерфейс C и (2) чтобы он не предоставлял часть поведения, обеспечиваемого классом B или с которым интерфейс C свяжет его.
Пример класса, нарушающего принцип подстановки Лискова, можно найти в ReadOnlyCollection<T>
, который реализует ICollection<T>
, но не обеспечивает требуемое поведение Add
или Remove
. Ясно, что для ReadOnlyCollection<T>
не имеет смысла разрешать добавление или удаление записей, но я подозреваю, что у него также были веские причины для реализации ICollection<T>
.
Предлагаем вам ознакомиться с проблемой кругового затмения.
По сути, LSP сложно реализовать, когда вы добавляете дополнительные условия к подтипам.
В случае круга дополнительным условием является то, что ширина должна быть равна высоте, но система, которая знает только о затмении суперкласса, рассчитывает иметь возможность изменять их независимо.
Обратите внимание, что это не проблема, если затмение не имеет сеттеров ширины или высоты. Поскольку система, использующая затмение, не может изменить их, круг не изменяет контракт затмения.