Sobes.tech
Senior

Barbara Liskovning o'rnashish printsipini tushuntiring.

sobes.tech AI

AIdan javob

Agar dasturda S T ning kichik turi bo'lsa, unda T turidagi obyektlar dasturda S turidagi obyektlar bilan almashtirilishi mumkin, bu dastur ish faoliyatiga ta'sir qilmaydi.

Asosiy nuqtalar:

  • Xulq-atvorni saqlash: Kichik tur, tashqi kuzatuvchi nuqtai nazaridan, asosiy tur bilan bir xil tarzda harakat qilishi kerak.
  • Barqarorliklar: Asosiy sinfning barqarorliklari, kichik sinflarda saqlanishi kerak.
  • Post-shartlar: Kichik sinfning post-shartlari (metod bajarilgandan keyin to'g'ri bo'lishi kerak bo'lgan shartlar), asosiy sinf bilan bir xil yoki kuchli bo'lishi kerak.
  • Old shartlar: Kichik sinfning old shartlari (metod bajarilishidan oldin to'g'ri bo'lishi kerak bo'lgan shartlar), asosiy sinf bilan bir xil yoki zaif bo'lishi kerak.

Python misoli:

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 # Prinsip buzilishi: kenglikni o'zgartirish balandlikni ham o'zgartiradi

    def set_height(self, height):
        self._width = height # Prinsip buzilishi: balandlikni o'zgartirish kenglikni ham o'zgartiradi
        self._height = height

# LSP ni buzadigan misol:
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"Rectantglening maydoni: {enlarge_rectangle(rect)}") # Kutilyapti 12

square = Square(2)
print(f"Kvadratning kengaytirilgan maydoni: {enlarge_rectangle(square)}") # Kutilyapti 9, lekin Square'da set_width/set_height sababli 16 bo'ladi. Buzilish!

Ushbu prinsip meros va polimorfizmning to'g'ri ishlashini ta'minlash uchun muhim bo'lib, kodni ishonchli va oldindan aytib bo'ladigan qiladi.