Proiectarea pentru moștenire și polimorfism

Programare orientată pe obiecte în Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfism

 

 

Utilizarea unei interfețe unificate pentru a opera pe obiecte din clase diferite

Programare orientată pe obiecte în Python

ierarhia claselor de conturi

Programare orientată pe obiecte în Python

Interfața este tot ce contează

# 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() nu trebuie să verifice obiectul pentru a ști ce withdraw() să apeleze
Programare orientată pe obiecte în Python

Principiul substituției Liskov

 

Clasa de bază trebuie să fie interschimbabilă cu oricare dintre subclasele sale, fără a modifica proprietățile programului

Oriunde funcționează BankAccount, CheckingAccount ar trebui să funcționeze la fel

fotografie a Barbarei Liskov

Programare orientată pe obiecte în Python

Principiul substituției Liskov

 

Clasa de bază trebuie să fie interschimbabilă cu oricare dintre subclasele sale, fără a modifica proprietățile programului

Sintactic
  • semnăturile funcțiilor sunt compatibile
    • argumente, valori returnate
Semantic
  • starea obiectului și a programului rămâne consistentă
    • metoda subclasă nu întărește condițiile de intrare
    • metoda subclasă nu slăbește condițiile de ieșire
    • nicio excepție suplimentară
Programare orientată pe obiecte în Python

Încălcarea PSL

Incompatibilitate sintactică

BankAccount.withdraw() necesită 1 parametru, dar CheckingAccount.withdraw() necesită 2

Subclasa întărește condițiile de intrare

BankAccount.withdraw() acceptă orice sumă, dar CheckingAccount.withdraw() presupune că suma este limitată

Subclasa slăbește condițiile de ieșire

BankAccount.withdraw() poate lăsa doar sold pozitiv sau genera o eroare, CheckingAccount.withdraw() poate lăsa soldul negativ

Programare orientată pe obiecte în Python

Încălcarea PSL

→ Modificarea unor atribute suplimentare în metoda subclasă

→ Aruncarea unor excepții suplimentare în metoda subclasă

Programare orientată pe obiecte în Python

 

 

 

 

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

Programare orientată pe obiecte în Python

Să exersăm!

Programare orientată pe obiecte în Python

Preparing Video For Download...