Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: Liskov Substitution Principle, SOLID, object-oriented design, inheritance, polymorphism, contract

В чем заключается принцип Liskov Substitution?

Вопрос проверяет понимание принципа подстановки Барбары Лисков (LSP), ключевого принципа SOLID, который обеспечивает корректность наследования и полиморфизма в объектно-ориентированном проектировании.

Короткий ответ

Принцип подстановки Лисков гласит, что объекты базового класса должны быть заменяемы объектами производного класса без изменения корректности программы. Это означает, что наследник не должен ужесточать предусловия или ослаблять постусловия родительского метода. Нарушение принципа приводит к неожиданным ошибкам при работе с полиморфными коллекциями. Соблюдение LSP делает архитектуру более устойчивой и предсказуемой.

Длинный ответ

Принцип подстановки Барбары Лисков (LSP) — это третий принцип SOLID, который формализует интуитивное понятие "является" в наследовании. Он утверждает, что если класс S является подтипом класса T, то объекты типа T могут быть заменены объектами типа S без нарушения корректности программы. Это не просто синтаксическая проверка (наследование в языке), а семантическое требование к поведению.

Ключевая идея: контракты и поведение

LSP тесно связан с концепцией контрактов (Design by Contract). Каждый метод имеет предусловия (условия, которые должны быть истинны до его вызова) и постусловия (условия, гарантируемые после выполнения). Наследник должен:

  • Не ужесточать предусловия (не требовать больше, чем родитель).
  • Не ослаблять постусловия (не гарантировать меньше, чем родитель).
  • Сохранять инварианты класса (условия, истинные на протяжении всей жизни объекта).

Пример нарушения LSP

Классический пример — иерархия "Прямоугольник-Квадрат". С математической точки зрения квадрат — это прямоугольник, но в программировании такое наследование часто нарушает 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 критически важен при использовании полиморфизма: при работе с коллекциями базового типа, в шаблонных методах или при внедрении зависимостей. Чтобы соблюдать принцип:

  • Избегайте наследования, если отношения "является" неполны или сомнительны.
  • Предпочитайте композицию наследованию.
  • Используйте интерфейсы и абстрактные классы для определения четких контрактов.
  • Пишите модульные тесты для базового класса, которые должны проходить и для всех наследников.

Вывод: Принцип подстановки Лисков — это фундаментальное правило для создания устойчивых иерархий наследования. Его стоит применять всегда при проектировании классов с наследованием, чтобы избежать тонких ошибок и обеспечить корректную работу полиморфного кода.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Java

    Java

  • C#

    C#

Ключевые слова

#Liskov Substitution Principle

#SOLID

#object-oriented design

#inheritance

#polymorphism

#contract

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.