Concevoir pour l'héritage et le polymorphisme

Programmation orientée objet en Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polymorphisme

 

 

Utiliser une interface unifiée pour traiter des objets de classes différentes

Programmation orientée objet en Python

hiérarchie des classes de comptes

Programmation orientée objet en Python

Seule l'interface compte

# 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() n'a pas besoin d'inspecter l'objet pour savoir quel withdraw() appeler
Programmation orientée objet en Python

Principe de substitution de Liskov

 

La classe de base doit être interchangeable avec n'importe laquelle de ses sous-classes sans modifier les propriétés du programme

Partout où BankAccount fonctionne, CheckingAccount devrait fonctionner aussi

photo de Barbara Liskov

Programmation orientée objet en Python

Principe de substitution de Liskov

 

La classe de base doit être interchangeable avec n'importe laquelle de ses sous-classes sans modifier les propriétés du programme

Syntaxiquement
  • les signatures de fonctions sont compatibles
    • arguments, valeurs retournées
Sémantiquement
  • l'état de l'objet et du programme demeure cohérent
    • la méthode de la sous-classe ne renforce pas les conditions d'entrée
    • la méthode de la sous-classe n'affaiblit pas les conditions de sortie
    • pas d'exceptions additionnelles
Programmation orientée objet en Python

Violation du LSP

Incompatibilité syntaxique

BankAccount.withdraw() exige 1 paramètre, mais CheckingAccount.withdraw() en exige 2

Renforcement des conditions d'entrée par la sous-classe

BankAccount.withdraw() accepte tout montant, mais CheckingAccount.withdraw() suppose que le montant est limité

Affaiblissement des conditions de sortie par la sous-classe

BankAccount.withdraw() ne peut laisser qu'un solde positif ou lever une erreur, CheckingAccount.withdraw() peut laisser un solde négatif

Programmation orientée objet en Python

Violation du LSP

→ Modifier des attributs supplémentaires dans la méthode de la sous-classe

→ Lancer des exceptions supplémentaires dans la méthode de la sous-classe

Programmation orientée objet en Python

 

 

 

 

$$\text{\textbf{\Huge{Pas de LSP — pas d'héritage}}}$$

Programmation orientée objet en Python

Passons à la pratique !

Programmation orientée objet en Python

Preparing Video For Download...