Projektowanie dla dziedziczenia i polimorfizmu

Programowanie obiektowe w Pythonie

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfizm

 

 

Używanie jednolitego interfejsu do operowania na obiektach różnych klas

Programowanie obiektowe w Pythonie

hierarchia klas kont

Programowanie obiektowe w Pythonie

Liczy się tylko interfejs

# Withdraw amount from each of accounts 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]) # <-- Will use BankAccount.withdraw(), # then CheckingAccount.withdraw(), # then SavingsAccount.withdraw()
  • batch_withdraw() nie musi sprawdzać obiektu, aby wywołać właściwe withdraw()
Programowanie obiektowe w Pythonie

Zasada podstawienia Liskov

 

Klasa bazowa powinna być wymienna z dowolną podklasą bez zmiany właściwości programu

Wszędzie tam, gdzie działa BankAccount, powinien działać również CheckingAccount

zdjęcie Barbary Liskov

Programowanie obiektowe w Pythonie

Zasada podstawienia Liskov

 

Klasa bazowa powinna być wymienna z dowolną podklasą bez zmiany właściwości programu

Składniowo
  • sygnatury funkcji są zgodne
    • argumenty, zwracane wartości
Semantycznie
  • stan obiektu i programu pozostaje spójny
    • metoda podklasy nie wzmacnia warunków wejściowych
    • metoda podklasy nie osłabia warunków wyjściowych
    • brak dodatkowych wyjątków
Programowanie obiektowe w Pythonie

Naruszanie LSP

Niezgodność składniowa

BankAccount.withdraw() wymaga 1 parametru, ale CheckingAccount.withdraw() wymaga 2

Podklasa wzmacnia warunki wejściowe

BankAccount.withdraw() akceptuje dowolną kwotę, ale CheckingAccount.withdraw() zakłada, że kwota jest ograniczona

Podklasa osłabia warunki wyjściowe

BankAccount.withdraw() może pozostawić tylko dodatnie saldo lub zgłosić błąd, CheckingAccount.withdraw() może pozostawić saldo ujemne

Programowanie obiektowe w Pythonie

Naruszanie LSP

→ Modyfikowanie dodatkowych atrybutów w metodzie podklasy

→ Zgłaszanie dodatkowych wyjątków w metodzie podklasy

Programowanie obiektowe w Pythonie

 

 

 

 

$$\text{\textbf{\Huge{No LSP -- No Inheritance}}}$$

Programowanie obiektowe w Pythonie

Czas na ćwiczenia!

Programowanie obiektowe w Pythonie

Preparing Video For Download...