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.
- 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- 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): passCrie a classe ContaPoupanca no arquivo conta.py e faça com que ela seja subclasse (filha) da classe Conta :
class ContaPoupanca(Conta): passReescreva 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- 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)- 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) .
- 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!
- 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 ?
- (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 .
- (opcional) Que maneira poderíamos implementar o método atualiza() nas classes
ContaCorrente e ContaPoupança poupando reescrita de código?
- (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?