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.