Həm varislik, həm də kompozisiya kodu təkrar istifadə edir, lakin sinifləri fərqli şəkildə bağlayır. Varislik (is-a) alt sinfi baza sinfin daxili hissələrinə bağlayır. Kompozisiya (has-a) bir obyekti digərinin içində saxlayır və yalnız onun açıq interfeysindən istifadə edir. Əsaslar Kompozisiya və varislik dərsindədir; bu dərs dizayn qərarı haqqındadır.

Solda `Penguin` `Bird.fly` metodunu miras alır və xəta atmalıdır; sağda `Bird`-də `Mover` var, onu `Fly` və `Walk` həyata keçirir
Solda Penguin Bird.fly metodunu miras alır və xəta atmalıdır; sağda Bird-də Mover var, onu Fly və Walk həyata keçirir

Varislik nə vaxt əsaslıdır

  • Həqiqi is-a. Hər alt sinif baza sinfin bütün vədlərini yerinə yetirir, ona görə baza sinfin gözlənildiyi hər yerdə istifadə oluna bilər: Liskov əvəzetmə prinsipi.
  • Genişləndirmə üçün nəzərdə tutulmuş sabit baza: Exception, abstrakt baza siniflər, unittest.TestCase kimi freymvork nöqtələri.
  • Dayaz ağac: bir-iki səviyyə.
python
class Bird:
    def fly(self):
        return "flap"

class Sparrow(Bird):
    pass

class Penguin(Bird):
    def fly(self):
        raise NotImplementedError("penguins cannot fly")

for b in [Sparrow(), Penguin()]:
    try:
        print(type(b).__name__, b.fly())
    except NotImplementedError as e:
        print(type(b).__name__, "fails:", e)
text
Sparrow flap
Penguin fails: penguins cannot fly

Penguin yerinə yetirə bilmədiyi fly() metodunu miras alır. İndi Bird obyektləri üzərində dövr edən hər kod xüsusi hal tələb edir. Alt sinif miras alınmış metodda NotImplementedError atırsa və ya səssizcə heç nə etmirsə, "is-a" yalnız illüziya idi.

Kövrək baza sinif