Примечание. Этот пост является частью серии постов о принципах SOLID для разработки программного обеспечения (в частности, на JavaScript). Все их можно найти по следующим ссылкам:
1. Единая ответственность
2. Открыто-закрыто
3. Подмена лисков
4. Разделение интерфейса »
5. Инверсия зависимостей
Принцип замещения Лисков гласит, что любой класс должен быть заменяемым для своего родительского класса без непредвиденных последствий. Другими словами, если классы Cat и Dog расширяют класс Animal, то мы ожидаем, что все функции, хранящиеся в классе Animal, будут вести себя нормально для объекта Cat и Dog.
Классическим примером нарушения подстановки Лискова является «задача квадрата и прямоугольника». В этой задаче предполагается, что класс Square
может наследоваться от класса Rectangle
. На первый взгляд, это имеет смысл; обе фигуры имеют две стороны, и обе вычисляют свою площадь, умножая свои стороны друг на друга.
Но проблема возникает, когда мы пытаемся использовать некоторые Rectangle
функции в Square
объекте. Давайте посмотрим на пример:
В этом примере мы инициализируем Rectangle
и Square
и выводим их размеры. Затем мы вызываем Rectangle.setHeight()
для объекта Square и снова выводим его размеры. Мы обнаруживаем, что высота квадрата отличается от его длины, что, конечно же, делает квадрат недействительным.
Это можно решить с помощью полиморфизма, оператора if в классе Rectangle или множества других методов. Но настоящая причина проблемы заключается в том, что Square
не является хорошим дочерним классом Rectangle
, и что на самом деле, возможно, обе формы вместо этого должны наследоваться от класса Shape
.