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.