L — Liskov Substitution Principle (Barbara Liskov): baza tipi gözləyən kod alt tipi qəbul edəndə də düzgün işləməlidir. Bu sintaksis yox, kontrakt məsələsidir: alt sinif eyni metodlara malik olsa da davranışı çağıranın gözləntisini pozursa, prinsip pozulub.
Klassik nümunə: Rectangle və Square
Riyaziyyatda kvadrat düzbucaqlıdır, ona görə Square(Rectangle) təbii görünür. Amma Square set_width-dan sonra hündürlüyü də dəyişir, və Rectangle kontraktı ("set_width hündürlüyə toxunmur") pozulur.
class Rectangle:
def __init__(self, w, h):
self.w, self.h = w, h
def set_width(self, w):
self.w = w
def set_height(self, h):
self.h = h
def area(self):
return self.w * self.h
class Square(Rectangle):
def __init__(self, side):
super().__init__(side, side)
def set_width(self, w): # a square keeps its sides equal
self.w = self.h = w
def set_height(self, h):
self.w = self.h = h
def stretch(rect):
rect.set_width(5)
rect.set_height(4)
return rect.area() # the caller expects 5 * 4
print(stretch(Rectangle(1, 1)))
print(stretch(Square(1)))20
16Həll: kvadratı düzbucaqlının alt sinfi etməyin. İkisi də ortaq Shape kontraktının qardaşıdır və ayrıca area() verir.
class Shape:
def area(self):
raise NotImplementedError
class Rectangle(Shape):
def __init__(self, w, h):
self.w, self.h = w, h