Senior
Vysvetlite princíp náhrady Barbary Liskov.
sobes.tech AI
Odpoveď od AI
Ak je v programe S podtyp T, potom objekty typu T v programe môžu byť nahradené objektmi typu S bez narušenia funkčnosti programu.
Kľúčové body:
- Zachovanie správania: Podtyp by sa mal správať rovnako ako jeho základný typ, z pohľadu vonkajšieho pozorovateľa.
- Invariaty: Invariaty základnej triedy by mali byť zachované v podtriedach.
- Postpodmienky: Postpodmienky (podmienky, ktoré musia byť pravdivé po vykonaní metódy) podtriedy by mali byť rovnaké alebo silnejšie ako u základnej triedy.
- Prepodmienky: Prepodmienky (podmienky, ktoré musia byť pravdivé pred vykonaním metódy) podtriedy by mali byť rovnaké alebo slabšie ako u základnej triedy.
Príklad v Pythone:
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 # Porušenie princípu: zmena šírky mení aj výšku
def set_height(self, height):
self._width = height # Porušenie princípu: zmena výšky mení aj šírku
self._height = height
# Príklad použitia, ktorý porušuje 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"Plocha po enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Očakáva sa 12
square = Square(2)
print(f"Plocha po enlarge_rectangle(square): {enlarge_rectangle(square)}") # Očakáva sa 9, ale kvôli set_width/set_height v Square bude 16. Porušenie!
Tento princíp je dôležitý pre zabezpečenie správnosti dedičnosti a polymorfizmu, a robí kód spoľahlivejším a predvídateľnejším.