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. Парушэнне!
Гэты прынцып важны для забеспячэння карэктнасці спадчыннасці і полімарфізму, робячы код больш надзейным і прадказальным.