Вопрос проверяет понимание принципа подстановки Барбары Лисков (LSP), ключевого принципа SOLID, который обеспечивает корректность наследования и полиморфизма в объектно-ориентированном проектировании.
Принцип подстановки Барбары Лисков (LSP) — это третий принцип SOLID, который формализует интуитивное понятие "является" в наследовании. Он утверждает, что если класс S является подтипом класса T, то объекты типа T могут быть заменены объектами типа S без нарушения корректности программы. Это не просто синтаксическая проверка (наследование в языке), а семантическое требование к поведению.
LSP тесно связан с концепцией контрактов (Design by Contract). Каждый метод имеет предусловия (условия, которые должны быть истинны до его вызова) и постусловия (условия, гарантируемые после выполнения). Наследник должен:
Классический пример — иерархия "Прямоугольник-Квадрат". С математической точки зрения квадрат — это прямоугольник, но в программировании такое наследование часто нарушает LSP.
class Rectangle {
protected width;
protected height;
setWidth(w) { this.width = w; }
setHeight(h) { this.height = h; }
getArea() { return this.width * this.height; }
}
class Square extends Rectangle {
setWidth(w) {
this.width = w;
this.height = w; // Нарушение: изменяет поведение!
}
setHeight(h) {
this.height = h;
this.width = h; // Нарушение: изменяет поведение!
}
}
// Клиентский код, ожидающий работу с Rectangle
function resizeRectangle(rect) {
rect.setWidth(5);
rect.setHeight(4);
console.log('Ожидаемая площадь 20:', rect.getArea());
}
const rect = new Rectangle();
resizeRectangle(rect); // Работает: площадь 20.
const sq = new Square();
resizeRectangle(sq); // Сломано! Площадь будет 16, а не 20.
Клиентский код resizeRectangle ожидает, что ширина и высота устанавливаются независимо. Квадрат нарушает это ожидание, изменяя оба измерения одновременно, что делает его неподходящей заменой для прямоугольника в данном контексте.
LSP критически важен при использовании полиморфизма: при работе с коллекциями базового типа, в шаблонных методах или при внедрении зависимостей. Чтобы соблюдать принцип:
Вывод: Принцип подстановки Лисков — это фундаментальное правило для создания устойчивых иерархий наследования. Его стоит применять всегда при проектировании классов с наследованием, чтобы избежать тонких ошибок и обеспечить корректную работу полиморфного кода.