Design für Vererbung und Polymorphismus

Objektorientierte Programmierung in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorphismus

 

 

Einheitliches Interface für Objekte verschiedener Klassen

Objektorientierte Programmierung in Python

Klassenhierarchie der Konten

Objektorientierte Programmierung in Python

Wichtig ist nur das Interface

# Betrag von jedem Konto in list_of_accounts abheben
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]) # <-- Verwendet BankAccount.withdraw(), # dann CheckingAccount.withdraw(), # dann SavingsAccount.withdraw()
  • batch_withdraw() muss nicht prüfen, welches withdraw() aufgerufen wird
Objektorientierte Programmierung in Python

Liskovsches Substitutionsprinzip

 

Basisklasse sollte ohne Änderungen mit jeder ihrer Unterklassen austauschbar sein

Wo BankAccount funktioniert, sollte auch CheckingAccount funktionieren

Foto von Barbara Liskov

Objektorientierte Programmierung in Python

Liskovsches Substitutionsprinzip

 

Basisklasse sollte ohne Änderungen mit jeder ihrer Unterklassen austauschbar sein

Syntaktisch
  • Funktionssignaturen sind kompatibel
    • Argumente, Rückgabewerte
Semantisch
  • Zustand des Objekts und Programms bleibt konsistent
    • Unterklassenmethode verschärft keine Eingabebedingungen
    • Unterklassenmethode schwächt keine Ausgabebedingungen
    • Keine zusätzlichen Ausnahmen
Objektorientierte Programmierung in Python

Verletzung des LSP

Syntaktische Inkompatibilität

BankAccount.withdraw() benötigt 1 Parameter, aber CheckingAccount.withdraw() benötigt 2

Unterklasse verschärft Eingabebedingungen

BankAccount.withdraw() akzeptiert jeden Betrag, aber CheckingAccount.withdraw() geht von einem begrenzten Betrag aus

Unterklasse schwächt Ausgabebedingungen

BankAccount.withdraw() kann nur ein positives Guthaben hinterlassen oder einen Fehler verursachen, CheckingAccount.withdraw() kann negatives Guthaben hinterlassen

Objektorientierte Programmierung in Python

Verletzung des LSP

→ Ändern zusätzlicher Attribute in der Methode der Unterklasse

→ Werfen zusätzlicher Ausnahmen in der Methode der Unterklasse

Objektorientierte Programmierung in Python

 

 

 

 

$$\text{\textbf{\Huge{Kein LSP -- Keine Vererbung}}}$$

Objektorientierte Programmierung in Python

Lass uns üben!

Objektorientierte Programmierung in Python

Preparing Video For Download...