Návrh pro dědičnost a polymorfismus

Object-Oriented Programming in Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorfismus

 

 

Použití jednotného rozhraní pro práci s objekty různých tříd

Object-Oriented Programming in Python

hierarchie tříd účtů

Object-Oriented Programming in Python

Důležité je pouze rozhraní

# 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() nepotřebuje kontrolovat objekt, aby věděl, které withdraw() zavolat
Object-Oriented Programming in Python

Liskovové princip substituce

 

Základní třída musí být zaměnitelná s libovolnou podtřídou, aniž by se změnily vlastnosti programu

Kdekoli funguje BankAccount, musí fungovat i CheckingAccount

fotografie Barbary Liskov

Object-Oriented Programming in Python

Liskovové princip substituce

 

Základní třída musí být zaměnitelná s libovolnou podtřídou, aniž by se změnily vlastnosti programu

Syntakticky
  • signatury funkcí jsou kompatibilní
    • argumenty, návratové hodnoty
Sémanticky
  • stav objektu a programu zůstává konzistentní
    • metoda podtřídy neposiluje vstupní podmínky
    • metoda podtřídy neoslabuje výstupní podmínky
    • žádné další výjimky
Object-Oriented Programming in Python

Porušení LSP

Syntaktická nekompatibilita

BankAccount.withdraw() vyžaduje 1 parametr, ale CheckingAccount.withdraw() vyžaduje 2

Podtřída posiluje vstupní podmínky

BankAccount.withdraw() přijímá libovolnou částku, ale CheckingAccount.withdraw() předpokládá omezení částky

Podtřída oslabuje výstupní podmínky

BankAccount.withdraw() zanechá kladný zůstatek nebo vyvolá chybu, CheckingAccount.withdraw() může zanechat záporný zůstatek

Object-Oriented Programming in Python

Porušení LSP

→ Změna dalších atributů v metodě podtřídy

→ Vyvolání dalších výjimek v metodě podtřídy

Object-Oriented Programming in Python

 

 

 

 

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

Object-Oriented Programming in Python

Pojďme si procvičit!

Object-Oriented Programming in Python

Preparing Video For Download...