Sobes.tech
Senior

Paaiškinkite Barbaros Liskov pakeitimo principą.

sobes.tech AI

Atsakymas iš AI

Jei programoje S yra T potipis, tada T tipo objektai programoje gali būti pakeisti S tipo objektais be programos veikimo sutrikdymo.

Pagrindiniai punktai:

  • Elgesio išsaugojimas: Potipis turi elgtis taip pat, kaip ir jo pagrindinis tipas, iš išorės stebėtojo perspektyvos.
  • Invariantai: Pagrindinio klases invariantai turi būti išsaugoti potipiuose.
  • Postkondicijos: Potipio postkondicijos (sąlygos, kurios turi būti teisingos po metodo vykdymo) turi būti tokios pačios arba stipresnės nei pagrindinio klases postkondicijos.
  • Prekondicijos: Potipio prekondicijos (sąlygos, kurios turi būti teisingos prieš metodo vykdymą) turi būti tokios pačios arba silpnesnės nei pagrindinio klases prekondicijos.

Python pavyzdys:

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 # Pažeidimas principo: plotis keičia ir aukštį

    def set_height(self, height):
        self._width = height # Pažeidimas principo: aukštis keičia ir plotį
        self._height = height

# Pavyzdys naudojimo, pažeidžiantis 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"Plotas po enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Tikimasi 12

square = Square(2)
print(f"Plotas po enlarge_rectangle(square): {enlarge_rectangle(square)}") # Tikimasi 9, bet dėl set_width/set_height Square bus 16. Pažeidimas!

Šis principas yra svarbus užtikrinant paveldėjimo ir polimorfizmo teisingą veikimą, darant kodą patikimesnį ir numatomą.