Sobes.tech
Senior

Қоидаи ивазкунии Барбара Лисковро шарҳ диҳед.

sobes.tech AI

Ҷавоб аз 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"Плошча пасля enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Чакана 12

square = Square(2)
print(f"Плошча пасля enlarge_rectangle(square): {enlarge_rectangle(square)}") # Чакана 9, але з-за set_width/set_height у Square будзе 16. Парушэнне!

Гэты прынцып важны для забеспячэння карэктнасці спадчыннасці і полімарфізму, робячы код больш надзейным і прадказальным.