Наведіть приклад порушення 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:
- Підклас змінює сенс поведінки методів.
У
Rectangleset_width()змінює тільки ширину. УSquare- ширину та висоту. Клієнтський код не очікує такої поведінки. - Клієнтський код починає працювати некоректно.
Наприклад:
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 # неправильно відносно очікувань- Підклас змушує клієнта робити перевірки типу.
python
if isinstance(rect, Square):
...Це пряме доведення порушення LSP.
Підсумок
Square не може замінювати Rectangle, хоча формально успадковується від нього - і це класичне порушення принципу підстановки Лісков.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.