Проверяет, понимает ли разработчик, что наследование должно сохранять поведение базового класса
LSP говорит, что любой дочерний класс должен полностью подходить на место своего родителя. То есть он не должен ломать поведение, ожидания или контракт. Нарушение происходит, когда дочерний класс меняет смысл методов, добавляет ограничения или вызывает неожиданные ошибки. Это приводит к нестабильному и трудно поддерживаемому коду.
Определение: Объекты подклассов должны быть взаимозаменяемы с объектами базового класса без изменения ожидаемого поведения.
LSP защищает от неправильного наследования и помогает строить корректные и безопасные иерархии.
Когда переопределённый метод делает что-то принципиально иное.
class Sword : Weapon {...}
class BrokenSword : Weapon
{
public override int Attack() => throw new Exception(); // нарушение
}
Например, метод в дочернем классе начинает запрещать входные данные, которые родитель принимал.
Если поведение становится нестабильным или непредсказуемым.
Часто случается, когда «is-a» заменяют «has-a».
Правильно:
class Fireball : Spell
{
public override int GetDamage() => baseDamage + bonus;
}
Неправильно:
class HealingSpell : Spell
{
public override int GetDamage() => 0; // нарушает контракт Spell
}
LSP нужно применять, когда используется наследование. Если дочерний класс нарушает контракт родителя — лучше использовать композицию.