Sobes.tech
Senior

Selgitage Barbara Liskovi asendusprintsiipi.

sobes.tech AI

Vastus AI-lt

Kui programmis S on T alamliik, siis programmis võivad T tüüpi objektid olla asendatud S tüüpi objektidega ilma programmi töökindlust rikkumata.

Põhipunktid:

  • Käitumise säilitamine: Alamliik peab käituma sama, nagu tema põhiliik, välise jälgija vaatenurgast.
  • Invariandid: Põhja klassi invariandid peavad säilima alamklassides.
  • Postkonditsioonid: Alamklassi postkonditsioonid (tingimused, mis peavad olema tõesed pärast meetodi täitmist) peavad olema samad või tugevamad kui põhiklassi postkonditsioonid.
  • Eeltingimused: Alamklassi eeltingimused (tingimused, mis peavad olema tõesed enne meetodi täitmist) peavad olema samad või nõrgemad kui põhiklassi eeltingimused.

Python näide:

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 # Põhimõtte rikkumine: laiuse muutmine mõjutab kõrgust

    def set_height(self, height):
        self._width = height # Põhimõtte rikkumine: kõrguse muutmine mõjutab laiust
        self._height = height

# Näide, mis rikub 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"Pindala pärast enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Oodatud 12

square = Square(2)
print(f"Pindala pärast enlarge_rectangle(square): {enlarge_rectangle(square)}") # Oodatud 9, kuid set_width/set_height tõttu Square puhul 16. Rikkumine!

See põhimõte on oluline, et tagada pärimise ja polümorfismi õige toimimine, muutes koodi usaldusväärsemaks ja etteaimatavamaks.