Projetando para herança e polimorfismo

Programação orientada a objetos em Python

Alex Yarosh

Content Quality Analyst @ DataCamp

Polimorfismo

 

 

Usando uma interface unificada para operar em objetos de diferentes classes

Programação orientada a objetos em Python

hierarquia de classes de conta

Programação orientada a objetos em Python

O que importa é a interface

# Retirar valor de cada conta em 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]) # <-- Usará BankAccount.withdraw(), # depois CheckingAccount.withdraw(), # depois SavingsAccount.withdraw()
  • batch_withdraw() não precisa verificar o objeto para saber qual withdraw() chamar
Programação orientada a objetos em Python

Princípio da substituição de Liskov

 

A classe base deve ser intercambiável com qualquer uma de suas subclasses sem alterar as propriedades do programa

Onde BankAccount funciona, CheckingAccount também deve funcionar

foto de Barbara Liskov

Programação orientada a objetos em Python

Princípio da substituição de Liskov

 

A classe base deve ser intercambiável com qualquer uma de suas subclasses sem alterar as propriedades do programa

Sintaticamente
  • assinaturas de funções são compatíveis
    • argumentos, valores retornados
Semanticamente
  • o estado do objeto e do programa permanece consistente
    • método da subclasse não reforça condições de entrada
    • método da subclasse não enfraquece condições de saída
    • sem exceções adicionais
Programação orientada a objetos em Python

Violando o LSP

Incompatibilidade sintática

BankAccount.withdraw() requer 1 parâmetro, mas CheckingAccount.withdraw() requer 2

Subclasse reforçando condições de entrada

BankAccount.withdraw() aceita qualquer valor, mas CheckingAccount.withdraw() assume que o valor é limitado

Subclasse enfraquecendo condições de saída

BankAccount.withdraw() só pode deixar saldo positivo ou causar erro, CheckingAccount.withdraw() pode deixar saldo negativo

Programação orientada a objetos em Python

Violando o LSP

→ Alterando atributos adicionais no método da subclasse

→ Lançando exceções adicionais no método da subclasse

Programação orientada a objetos em Python

 

 

 

 

$$\text{\textbf{\Huge{Sem LSP -- Sem Herança}}}$$

Programação orientada a objetos em Python

Vamos praticar!

Programação orientada a objetos em Python

Preparing Video For Download...