Назад к вопросам
Senior
124
questionbank
Объясните принцип подстановки Барбары Лисков.
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Если в программе S является подтипом T, то объекты типа T в программе могут быть заменены на объекты типа S без нарушения работоспособности программы.
Ключевые моменты:
- Сохранение поведения: Подтип должен вести себя так же, как его базовый тип, с точки зрения внешнего наблюдателя.
- Инварианты: Инварианты базового класса должны сохраняться в подклассах.
- Постусловия: Постусловия (условия, которые должны быть истинны после выполнения метода) подкласса должны быть такими же или более сильными, чем постусловия базового класса.
- Предусловия: Предусловия (условия, которые должны быть истинны перед выполнением метода) подкласса должны быть такими же или более слабыми, чем предусловия базового класса.
Пример на Python:
class Rectangle:
def __init__(self, width, height):
self._width = width
self._height = height
def set_width(self, width):
self._width = width
def set_height(self, height):
self._height = height
def area(self):
return self._width * self._height
class Square(Rectangle):
def __init__(self, side):
super().__init__(side, side)
def set_width(self, width):
self._width = width
self._height = width # Нарушение принципа: изменение ширины меняет и высоту
def set_height(self, height):
self._width = height # Нарушение принципа: изменение высоты меняет и ширину
self._height = height
# Пример использования, нарушающего LSP:
def enlarge_rectangle(rectangle):
rectangle.set_width(rectangle._width + 1)
rectangle.set_height(rectangle._height + 1)
return rectangle.area()
rect = Rectangle(2, 3)
print(f"Area after enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Ожидается 12
square = Square(2)
print(f"Area after enlarge_rectangle(square): {enlarge_rectangle(square)}") # Ожидается 9, но из-за set_width/set_height в Square будет 16. Нарушение!
Этот принцип важен для обеспечения корректности наследования и полиморфизма, делая код более надежным и предсказуемым.