Skip to main content

Наведіть приклад порушення LSP

Приклад порушення LSP - це ситуація, коли нащадок ламає очікування, задані базовим класом. Один з найвідоміших прикладів - відношення прямокутника і квадрата.

Приклад:

Базовий клас:

python
class Rectangle: def __init__(self, width, height): self.width = width self.height = height def set_width(self, w): self.width = w def set_height(self, h): self.height = h def area(self): return self.width * self.height

Підклас:

python
class Square(Rectangle): def set_width(self, w): self.width = w self.height = w # порушує контракт def set_height(self, h): self.width = h self.height = h # порушує контракт

Чому це порушення LSP:

  1. Підклас змінює сенс поведінки методів. У Rectangle set_width() змінює тільки ширину. У Square - ширину та висоту. Клієнтський код не очікує такої поведінки.
  2. Клієнтський код починає працювати некоректно.

Наприклад:

python
def resize(rect: Rectangle): rect.set_width(10) rect.set_height(20) return rect.area()

Очікувана поведінка для прямокутника:

javascript
area = 10 * 20 = 200

Фактична поведінка для квадрата:

javascript
set_width(10) → width=10, height=10 set_height(20) → width=20, height=20 area = 20 * 20 = 400 # неправильно відносно очікувань
  1. Підклас змушує клієнта робити перевірки типу.
python
if isinstance(rect, Square): ...

Це пряме доведення порушення LSP.

Підсумок

Square не може замінювати Rectangle, хоча формально успадковується від нього - і це класичне порушення принципу підстановки Лісков.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.