Ответ
Принцип подстановки Лисков (Liskov Substitution Principle, LSP) гласит, что объекты базового класса должны заменяться объектами производных классов без изменения корректности программы.
Пример нарушения LSP:
open class Rectangle(val width: Int, val height: Int) {
open fun area() = width * height
}
class Square(width: Int) : Rectangle(width, width) {
override fun area() = super.area()
// Нарушение LSP: квадрат не может изменять ширину/высоту независимо
}
Исправленный вариант:
interface Shape {
fun area(): Int
}
class Rectangle(val width: Int, val height: Int) : Shape {
override fun area() = width * height
}
class Square(val side: Int) : Shape {
override fun area() = side * side
}
Теперь Rectangle и Square — независимые реализации Shape, и замена одной на другую не нарушит логику.