Sobes.tech
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.