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.

python
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)))
text
20
16
Eyni çağırışlar: Rectangle 20, Square 16
Eyni çağırışlar: Rectangle 20, Square 16

Hə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.

python
class Shape:
    def area(self):
        raise NotImplementedError

class Rectangle(Shape):
    def __init__(self, w, h):
        self.w, self.h = w, h