Kalıtım ve çok biçimlilik için tasarım

Python'da Nesne Yönelimli Programlama

Alex Yarosh

Content Quality Analyst @ DataCamp

Çok biçimlilik

 

 

Farklı sınıfların nesneleri üzerinde çalışmak için birleşik bir arayüz kullanma

Python'da Nesne Yönelimli Programlama

hesap sınıfları hiyerarşisi

Python'da Nesne Yönelimli Programlama

Önemli olan tek şey arayüz

# list_of_accounts içindeki her bir hesaptan miktar çek
def batch_withdraw(list_of_accounts, amount):
   for acct in list_of_accounts:
      acct.withdraw(amount)

b, c, s = BankAccount(1000), CheckingAccount(2000), SavingsAccount(3000) batch_withdraw([b,c,s]) # <-- Önce BankAccount.withdraw(), # sonra CheckingAccount.withdraw(), # sonra SavingsAccount.withdraw() kullanılır
  • batch_withdraw() hangi withdraw() çağrılacağını bilmek için nesneyi kontrol etmez
Python'da Nesne Yönelimli Programlama

Liskov yerine geçme ilkesi

 

Taban sınıf, programın özelliklerini değiştirmeden herhangi bir alt sınıfıyla değiştirilebilir olmalıdır

BankAccount'un çalıştığı her yerde CheckingAccount da çalışmalıdır

Barbara Liskov'un fotoğrafı

Python'da Nesne Yönelimli Programlama

Liskov yerine geçme ilkesi

 

Taban sınıf, programın özelliklerini değiştirmeden herhangi bir alt sınıfıyla değiştirilebilir olmalıdır

Sözdizimsel olarak
  • fonksiyon imzaları uyumludur
    • argümanlar, döndürülen değerler
Anlamsal olarak
  • nesnenin ve programın durumu tutarlıdır
    • alt sınıf metodu giriş koşullarını güçlendirmez
    • alt sınıf metodu çıkış koşullarını zayıflatmaz
    • ek istisnalar yoktur
Python'da Nesne Yönelimli Programlama

LSP ihlali

Sözdizimsel uyumsuzluk

BankAccount.withdraw() 1 parametre gerektirir, ancak CheckingAccount.withdraw() 2 gerektirir

Alt sınıfın giriş koşullarını güçlendirmesi

BankAccount.withdraw() herhangi bir miktarı kabul eder, ancak CheckingAccount.withdraw() miktarın sınırlı olduğunu varsayar

Alt sınıfın çıkış koşullarını zayıflatması

BankAccount.withdraw() yalnızca pozitif bakiye bırakabilir veya hata oluşturabilir, CheckingAccount.withdraw() negatif bakiye bırakabilir

Python'da Nesne Yönelimli Programlama

LSP ihlali

→ Alt sınıf metodunda ek niteliklerin değiştirilmesi

→ Alt sınıf metodunda ek istisnaların atılması

Python'da Nesne Yönelimli Programlama

 

 

 

 

$$\text{\textbf{\Huge{LSP Yoksa -- Kalıtım Yok}}}$$

Python'da Nesne Yönelimli Programlama

Hadi pratik yapalım!

Python'da Nesne Yönelimli Programlama

Preparing Video For Download...