Этот вопрос проверяет корректность использования наследования и понимание контрактов между базовыми и дочерними типами.
Принцип подстановки Лисков говорит о том, что объект подкласса должен полностью заменять объект базового класса без изменения поведения программы. Если код работает с базовым типом, он должен так же корректно работать и с его наследником. Подкласс не должен усиливать ограничения или нарушать ожидаемую логику. Нарушение этого принципа приводит к неожиданным багам. Фактически это правило корректного наследования.
Liskov Substitution Principle (LSP) — объекты подклассов должны быть взаимозаменяемы с объектами базового класса без изменения корректности программы.
Если функция ожидает объект базового класса, она не должна «ломаться», когда получает объект наследника.
class Rectangle {
var width: Double = 0
var height: Double = 0
}
class Square: Rectangle {
override var width: Double {
didSet { height = width }
}
}
Square нарушает ожидания Rectangle, изменяя поведение сеттеров.
логика становится неочевидной
появляются скрытые ошибки
полиморфизм перестаёт работать корректно
Не усиливать предусловия
Не ослаблять постусловия
Не менять смысл методов базового класса
осторожно использовать наследование от UIKit-классов
предпочитать протоколы и композицию
LSP — это индикатор правильного наследования. Если наследник нельзя безопасно подставить вместо базового класса, значит архитектурное решение выбрано неверно.