Ontwerpen voor overerving en polymorfisme

Objectgeoriënteerd programmeren in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorfisme

 

 

Een uniforme interface gebruiken om op objecten van verschillende klassen te werken

Objectgeoriënteerd programmeren in Python

hiërarchie van accountklassen

Objectgeoriënteerd programmeren in Python

De interface is alles wat telt

# Bedrag opnemen van elke account in list_of_accounts
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]) # <-- Zal BankAccount.withdraw() gebruiken, # dan CheckingAccount.withdraw(), # dan SavingsAccount.withdraw()
  • batch_withdraw() hoeft het object niet te controleren om te weten welke withdraw() aan te roepen
Objectgeoriënteerd programmeren in Python

Liskov substitutieprincipe

 

Basisklasse moet uitwisselbaar zijn met elke subklasse zonder eigenschappen van het programma te veranderen

Waar BankAccount werkt, moet CheckingAccount ook werken

foto van Barbara Liskov

Objectgeoriënteerd programmeren in Python

Liskov substitutieprincipe

 

Basisklasse moet uitwisselbaar zijn met elke subklasse zonder eigenschappen van het programma te veranderen

Syntactisch
  • Functiesignaturen zijn compatibel
    • Argumenten, geretourneerde waarden
Semantisch
  • De toestand van het object en het programma blijft consistent
    • Subklasse methode versterkt invoercondities niet
    • Subklasse methode verzwakt uitvoercondities niet
    • Geen extra uitzonderingen
Objectgeoriënteerd programmeren in Python

LSP schending

Syntactische incompatibiliteit

BankAccount.withdraw() vereist 1 parameter, maar CheckingAccount.withdraw() vereist 2

Subklasse versterkt invoercondities

BankAccount.withdraw() accepteert elk bedrag, maar CheckingAccount.withdraw() gaat ervan uit dat het bedrag beperkt is

Subklasse verzwakt uitvoercondities

BankAccount.withdraw() kan alleen een positief saldo achterlaten of een fout veroorzaken, CheckingAccount.withdraw() kan een negatief saldo achterlaten

Objectgeoriënteerd programmeren in Python

LSP schending

→ Wijzigen van extra attributen in methode van subklasse

→ Gooien van extra uitzonderingen in methode van subklasse

Objectgeoriënteerd programmeren in Python

 

 

 

 

$$\text{\textbf{\Huge{Geen LSP -- Geen Overerving}}}$$

Objectgeoriënteerd programmeren in Python

Aan de slag!

Objectgeoriënteerd programmeren in Python

Preparing Video For Download...