Senior
Izskaidrojiet Barbaras Liskovas aizvietošanas principu.
sobes.tech AI
Atbilde no AI
Ja programmā S ir T apakštipa, tad T tipa objekti programmā var tikt aizstāti ar S tipa objektiem bez programmas darbības traucējumiem.
Galvenie punkti:
- Uzvedības saglabāšana: Apakštipam jāuzvedas tāpat kā tā pamattipam, no ārējā novērotāja skatpunkta.
- Invarianti: Pamatklases invariantiem jābūt saglabātiem apakšklasēs.
- Postkondīcijas: Apakšklases postkondīcijas (nosacījumi, kas jābūt patiesiem pēc metodes izpildes) jābūt tādām pašām vai stiprākām nekā pamatklases postkondīcijas.
- Priekšnosacījumi: Apakšklases priekšnosacījumi (nosacījumi, kas jābūt patiesiem pirms metodes izpildes) jābūt tādiem pašiem vai vājākiem nekā pamatklases priekšnosacījumi.
Python piemērs:
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 # Principa pārkāpums: platuma maiņa ietekmē arī augstumu
def set_height(self, height):
self._width = height # Principa pārkāpums: augstuma maiņa ietekmē arī platumu
self._height = height
# Piemērs, kas pārkāpj 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"Platība pēc enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Sagaidāms 12
square = Square(2)
print(f"Platība pēc enlarge_rectangle(square): {enlarge_rectangle(square)}") # Sagaidāms 9, bet ar set_width/set_height Square būs 16. Pārkāpums!
Šis princips ir svarīgs, lai nodrošinātu pareizu mantošanu un polimorfismu, padarot kodu uzticamāku un paredzamāku.