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