Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про C#: liskov, substitution

Что такое принцип подстановки Барбары Лисков (LSP) и как его часто нарушают?

Проверяет, понимает ли разработчик, что наследование должно сохранять поведение базового класса

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

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

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

Принцип подстановки Барбары Лисков

Определение: Объекты подклассов должны быть взаимозаменяемы с объектами базового класса без изменения ожидаемого поведения.

LSP защищает от неправильного наследования и помогает строить корректные и безопасные иерархии.

Частые нарушения LSP

1. Изменение поведения метода родителя

Когда переопределённый метод делает что-то принципиально иное.

class Sword : Weapon {...}
class BrokenSword : Weapon
{
    public override int Attack() => throw new Exception(); // нарушение
}

2. Добавление неожиданных ограничений

Например, метод в дочернем классе начинает запрещать входные данные, которые родитель принимал.

3. Неожиданные сайд-эффекты

Если поведение становится нестабильным или непредсказуемым.

4. Неправильное использование наследования вместо композиции

Часто случается, когда «is-a» заменяют «has-a».

Примеры правильного и неправильного наследования

Правильно:

class Fireball : Spell
{
    public override int GetDamage() => baseDamage + bonus;
}

Неправильно:

class HealingSpell : Spell
{
    public override int GetDamage() => 0; // нарушает контракт Spell
}

Краткий вывод

LSP нужно применять, когда используется наследование. Если дочерний класс нарушает контракт родителя — лучше использовать композицию.

  • Аватар

    Unity Guru

    Oleg Miroshkin

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • C#

    C#

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

#liskov

#substitution

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

  • Аватар

    Unity Guru

    Oleg Miroshkin

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