Senior
Magyarázza el Barbara Liskov helyettesítési elvét.
sobes.tech MI
Válasz az MI-től
Ha egy programban az S T egyik alkönyvtípusa, akkor a programban lévő T típusú objektumokat S típusú objektumokra cserélhetjük anélkül, hogy a program működése megsérülne.
Fő pontok:
- Viselkedés megőrzése: Az alkönyvtípusnak ugyanúgy kell viselkednie, mint a bázistípusnak, a külső megfigyelő szempontjából.
- Invariánsok: A bázisklassz invariánsait meg kell tartani az alkönyvtárakban.
- Posztfeltételek: Az alkönyvtár posztfeltételeinek (feltételek, amelyeknek igaznak kell lenniük a módszer végrehajtása után) ugyanolyannak vagy erősebbnek kell lenniük, mint a bázisklassz posztfeltételei.
- Előfeltételek: Az alkönyvtár előfeltételeinek (feltételek, amelyeknek igaznak kell lenniük a módszer végrehajtása előtt) ugyanolyannak vagy gyengébbnek kell lenniük, mint a bázisklassz előfeltételei.
Python példával:
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 # Szabály megsértése: a szélesség változtatása a magasságot is változtatja
def set_height(self, height):
self._width = height # Szabály megsértése: a magasság változtatása a szélességet is változtatja
self._height = height
# Példa a LSP megsértésére:
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"Terület a növelő téglalap után: {enlarge_rectangle(rect)}") # Várható 12
square = Square(2)
print(f"Növelt négyzet területe: {enlarge_rectangle(square)}") # Várható 9, de a set_width/set_height miatt 16 lesz. Megsértés!
Ez az elv fontos a öröklődés és a polimorfizmus helyes működésének biztosításához, és a kód megbízhatóbbá és előre jelezhetőbbé tételéhez.