Назад к вопросам
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. Нарушение!

Этот принцип важен для обеспечения корректности наследования и полиморфизма, делая код более надежным и предсказуемым.