11.7 Exercício: Herança E Polimorfismo

Vamos ter mais de um tipo de conta no nosso sistema. Portanto, além das informações que já tínhamos na conta, temos agora o tipo: se queremos uma conta corrente ou uma conta poupança. Além disso, cada uma deve possuir uma taxa.

  1. Adicione na classe Conta um novo método chamado atualiza() que atualiza a conta de acordo com a taxa percentual:
class Conta:

outros métodos

def atualiza(self, taxa): self._saldo += self._saldo \* taxa
  1. Crie duas subclasses da classe Conta : ContaCorrente e ContaPoupanca . Ambas terão o método atualiza() reescrito: a ContaCorrente deve atualizar-se com o dobro da taxa e a ContaPoupanca deve atualizar-se com o triplo da taxa. Além disso, a ContaCorrente deve reescrever o método deposita() a fim de retirar uma taxa bancária de dez centavos de cada depósito.

Crie a classe ContaCorrente no arquivo conta.py e faça com que ela seja subclasse (filha) da classe Conta .

class ContaCorrente(Conta): pass

Crie a classe ContaPoupanca no arquivo conta.py e faça com que ela seja subclasse (filha) da classe Conta :

class ContaPoupanca(Conta): pass

Reescreva o método atualiza() na classe ContaCorrente , seguindo o enunciado:

class ContaCorrente(Conta): def atualiza(self, taxa):

self._saldo += self._saldo * taxa *

Reescreva o método atualiza() na classe ContaPopanca , seguindo o enunciado:

class ContaPoupanca(Conta): def atualiza(self, taxa):

self._saldo += self._saldo * taxa *

Na classe ContaCorrente , reescreva o método deposita() para descontar a taxa bancária de dez centavos:

class ContaCorrente(Conta):
python
def atualiza(self, taxa):

self._saldo += self._saldo * taxa *

def deposita(self, valor): self._saldo += valor - 0.10
  1. Agora, teste suas classes no próprio módulo conta.py . Acrescente a condição quando o módulo for igual a main para executarmos no console no PyCharm. Instancie essas classes, atualize-as e veja o resultado:
if name == ' main '
 
c = Conta('123-4', 'Joao', 1000.0)
 
cc = ContaCorrente('123-5', 'Jose', 1000.0) cp = ContaPoupanca('123-6', 'Maria', 1000.0)
 
c.atualiza(0.01) cc.atualiza(0.01) cp.atualiza(0.01)
 
java
print(c.saldo) print(cc.saldo) print(cp.saldo)
  1. Implemente o método str () na classe Conta . Faça com que ele imprima uma representação

11.7 EXERCÍCIO: HERANÇA E POLIMORFISMO

mais amigável de um Conta contendo todos os seus atributos.

def str (self):
 
return f'Dados da Conta: \nNumero: {} \nTitular: {} \nSaldo: {} \nLimite:{} {self._nume ro, self._titular, self._limite, self._saldo}'
 
Teste chamando o método print(cc) .
 
  1. Vamos criar uma classe que seja responsável por fazer a atualização de todas as contas bancárias e gerar um relatório com o saldo anterior e saldo novo de cada uma das contas. Na pasta src , crie a classe AtualizadorDeContas :
def __init__(self, selic, saldo_total=0): self._selic = selic self._saldo_total = saldo_total
 
#propriedades
 
def roda(self, conta):
 
print(f'Saldo da Conta: {} {conta.saldo}') self._saldo_total += conta.atualiza(self._selic) print(f'Saldo Final: {} {self._saldo_total}')
 

Dica: Para o valor de _saldo_total ser atualizado corretamente, atualize todas as funções atualiza

nas outras classes para retornarem o valor correto com return self._saldo

Não esqueça de fazer os imports necessários para o código funcionar!

  1. Na ‘main’, vamos criar algumas contas e rodá-las a partir do AtualizadorDeContas :
if name == ' main ':
 
c = Conta('123-4', 'Joao', 1000.0)
 
cc = ContaCorrente('123-5', 'José', 1000.0) cp = ContaPoupanca('123-6', 'Maria', 1000.0)
 
adc = AtualizadorDeContas(0.01) adc.roda(c)
 
adc.roda(cc) adc.roda(cp)
 
print(f'Saldo total: {} {adc.saldo_total}')
 
2. (opcional) Se você precisasse criar uma classe ContaInvestimento , e seu método atualiza()
 

fosse complicadíssimo, você precisaria alterar a classe AtualizadorDeContas ?

  1. (opcional, Trabalhoso) Crie uma classe Banco que possui uma lista de contas. Repare que em uma lista de contas você pode colocar tanto ContaCorrente quanto ContaPoupanca . Crie um método adiciona() que adiciona uma conta na lista de contas; um método pegaConta() que devolve a conta em determinada posição da lista e outro pegaTotalDeContas() que retorna o total de contas na lista. Depois teste criando diversas contas, insira-as no Banco e depois, com um laço for ,

percorra todas as contas doBanco para passá-las como argumento para o método roda() do‌

AtualizadorDeContas .

  1. (opcional) Que maneira poderíamos implementar o método atualiza() nas classes

ContaCorrente e ContaPoupança poupando reescrita de código?

  1. (opcional) E se criarmos uma classe que não é filha de Conta e tentar passar uma instância no método roda de AtualizadorDeContas ? Com o que aprendemos até aqui, como podemos evitar que erros aconteçam nestes casos?

⬅️ Capítulo Anterior | Próximo Capítulo ➡️