Примечание. Этот пост является частью серии постов о принципах 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.