Oi Cleiver,
Realmente se vc quiser chamar um metodo especifico de ContaCorrente ai nao faz sentido seu metodo receber qualquer Conta (casting é a excecao da excecao, idealmente vc nunca faria casting).
Ter o momento "Aha" do polimorfismo é um passo bem complicado mesmo no aprendizado de orientação a objetos, fique tranquilo. Mas é bem importante. Polimorfismo é um dos alicerces de OO e muito, mas muito útil na pratica, acredite.
Deixa eu tentar elaborar o exemplo do método que recebe Conta pra ver se vc acha bacana:
Imagina que quero fazer um método que soma o saldo de um monte de contas. A classe Conta
possui um getSaldo
que é herdado por ambas as classes ContaCorrente
e ContaPoupanca
. Cada uma delas pode ter metodos especificos, mas o que quero apenas somar o saldo, e eu sei que ambas possuem getSaldo
porque herdam de Conta
.
Graças ao polimorfirmo eu posso fazer um método soma
que recebe um array de Conta
e faz a conta pra mim:
double soma (Conta... contas) {
double saldo = 0.0;
for (Conta c : contas) {
soma += c.getSaldo();
}
return soma;
}
É muito forte isso de que eu posso chamar esse método passando objetos de varios tipos filhos especificos: ContaCorrente
, ContaPoupanca
, ContaInvestimento
etc:
ContaCorrente cc1 = new ContaCorrente();
cc1.deposita(1000);
ContaCorrente cc2 = new ContaCorrente();
cc2.deposita(1000);
ContaPoupanca cp1 = new ContaPoupanca();
cp1.deposita(500);
ContaPoupanca cp2 = new ContaPoupanca();
cp2.deposita(500);
double somaFinal = soma(cc1, cc2, cp1, cp2);
Imagine por um momento que não existisse polimorfismo. Como eu somaria o saldo de um punhado de ContaCorrente
e um punhado de ContaPoupanca
?
Como não tem poliformismo, meu método não pode receber Conta
. Entao preciso fazer um que recebe ContaCorrente
apenas:
double somaCC (ContaCorrente... contasCorrente) { ... }
E outro que recebe ContaPoupanca
:
double somaCP (ContaPoupanca... contasPoupanca) { ... }
Acabo de duplicar minha logica, infelizmente. Mas nao so isso, na hora de chamar preciso lembrar de chamar os dois:
double somaFinal = somaCC(cc1, cc2) + somaCP(cp1, cp2);
E a gente pode ate pensar que isso nao é um grande trabalho. Mas e se tenho um terceiro tipo de Conta, ContaInvestimento
? E depois um ContaEmpresa
? E etc.
Quando usamod polimorfismo lá em cima, não precisamos nos preocupar com nada disso. É muito melhor :)