Square нарушает контракт изменяемого Rectangle, если ширину и высоту прямоугольника можно менять независимо. После set_width(3), set_height(4) площадь Square будет 16, а ожидаемая для Rectangle — 12.
класс Rectangle:
Square нарушает контракт изменяемого Rectangle, если ширину и высоту прямоугольника можно менять независимо. После set_width(3), set_height(4) площадь Square будет 16, а ожидаемая для Rectangle — 12.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
класс Rectangle: def set_width(self, width): self._width = width
def set_height(self, height):
self._height = height
def get_area(self):
return self._width * self._height
класс Square(Rectangle): def set_width(self, width): self._width = width self._height = width
def set_height(self, height):
self._width = height
self._height = height
Ответ
Square нарушает контракт изменяемого Rectangle, если ширину и высоту прямоугольника можно менять независимо. После set_width(3), set_height(4) площадь Square будет 16, а ожидаемая для Rectangle — 12.
Это классический пример нарушения принципа подстановки Лисков: математическое отношение «квадрат — прямоугольник» не гарантирует корректного наследования объектов с такими setter-методами. Можно разделить классы и дать общий интерфейс area, либо использовать неизменяемые фигуры с явными конструкторами. В представленном коде также нет инициализации размеров: get_area до setter вызовет AttributeError. Для исполняемого Python ключевое слово должно быть class, не «класс».