Ответ
Принцип подстановки Барбары Лисков (LSP) гласит: подтипы должны быть заменяемыми на свои базовые типы без нарушения работы программы.
Основные идеи:
- Наследники не должны ужесточать предусловия (требования к входным данным).
- Наследники не должны ослаблять постусловия (гарантии на выходные данные).
- Наследники должны сохранять инварианты базового класса.
Пример нарушения LSP:
class Rectangle {
constructor(public width: number, public height: number) {}
setWidth(width: number) { this.width = width; }
setHeight(height: number) { this.height = height; }
}
class Square extends Rectangle {
setWidth(width: number) {
this.width = width;
this.height = width; // Нарушение LSP, меняет поведение родителя
}
}
function testArea(shape: Rectangle) {
shape.setWidth(5);
shape.setHeight(4);
console.log(shape.width * shape.height); // Ожидается 20, но для Square будет 25
}
Вывод: Наследование должно дополнять, а не изменять логику базового класса.