Sobes.tech
Senior

Ներկայացրեք Բարբարա Լիսկովի փոխարինման սկզբունքը։

sobes.tech AI

Պատասխան AI-ից

Եթե ծրագրում S տիպը T ենթատիպ է, ապա T տիպի օբյեկտները կարող են փոխարինվել S տիպի օբյեկտներով առանց ծրագրի աշխատանքային կարողության խախտման:

Հիմնական կետեր:

  • Կատարման պահպանում: Պատիպը պետք է պահպանի իր հիմնական տիպի վարքագիծը արտաքին դիտորդի տեսանկյունից:
  • Ինվարիանտներ: Հիմնական դասի ինվարիանտները պետք է պահպանվեն ենթակլասներում:
  • Պոստպայմաններ: Սուբքլասի պոստպայմանները (պայմաններ, որոնք պետք է ճիշտ լինեն մեթոդի կատարման հետո) պետք է լինեն նույնը կամ ավելի ուժեղ, քան հիմնական դասի պոստպայմանները:
  • Նախապայմաններ: Սուբքլասի նախապայմանները (պայմաններ, որոնք պետք է ճիշտ լինեն մեթոդի կատարման առաջ) պետք է լինեն նույնը կամ ավելի թույլ, քան հիմնական դասի նախապայմանները:

Python-ի օրինակ:

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 # Պատճառը խախտում է սկզբունքը՝ փոփոխել լայնությունը՝ փոխելով բարձրությունը

    def set_height(self, height):
        self._width = height # Պատճառը խախտում է սկզբունքը՝ փոփոխել բարձրությունը՝ փոխելով լայնությունը
        self._height = height

# Օրինակ օգտագործում, որը խախտում է 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"Տարածք՝ after enlarge_rectangle(rect): {enlarge_rectangle(rect)}") # Ապահովում է 12

square = Square(2)
print(f"Տարածք՝ after enlarge_rectangle(square): {enlarge_rectangle(square)}") # Ապահովում է 9, բայց set_width/set_height-ով Square-ում կլինի 16։ Խախտում է սկզբունքը!

Այս սկզբունքը կարևոր է ժառանգության և պոլիմորֆիզմի ճիշտ աշխատանքի ապահովման համար, դարձնելով կոդը ավելի հուսալի և կանխատեսելի։