Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvida Exercício 5

Eu entendi que a assinatura do método, ao utilizar como parâmetro uma referência à superclasse permite que as subclasses possam sem referenciadas...

public void roda(Conta c) {

Apesar disso, continuo com a seguinte dúvida:

No exercício há a proposta da seguinte mudança no código:

De:

Conta c = new Conta();
ContaCorrente cc = new ContaCorrente();
ContaPoupanca cp = new ContaPoupanca();

Para:

Conta c = new Conta();
Conta cc = new ContaCorrente();
Conta cp = new ContaPoupanca();

Considerando que o programa executou sem erros e teve o mesmo resultado nas 2 formas, qual a real necessidade de fazer a mudança sugerida no tipo dos atributos c, cc e cp?

8 respostas

Nenhuma :). É só para demonstrar um pouco do polimorfismo.

Você deixa seu código mais flexível Leandro.

Você mesmo respondeu "Eu entendi que a assinatura do método, ao utilizar como parâmetro uma referência à superclasse permite que as subclasses possam sem referenciadas..."

Essa flexibilidade irá lhe permitir mudar o comportamento do seu objeto em tempo de execução. Isso deixa o código mais elegante e, possivelmente, menor, já que você também pode aproveitar boa parte dos métodos da classe Conta para as classes filhas. Enfim, é um bom exemplo de uso da herança.

É, então Emerson, a parte da polimorfia no que diz respeito à assinatura do método está clara.

Pelo que Alberto comentou, tanto faz escrever:

Conta cc = new ContaCorrente();

Como:

ContaCorrente cc = new ContaCorrente();

O que eu fico me perguntando é: se é possível escrever das 2 formas, não tem diferença realmente nenhuma? Se fosse PHP eu não desconfiaria, mas Java?

Boa noite Leandro, Então cara, assim como o Alberto falou na verdade é apenas uma forma de mostrar o polimorfismo na pratica. Do mesmo jeito que você pode usar como parâmetro no método a superclasse (ganhando polimorfismo), você também pode utilizar a superclasse para criar variáveis e/ou estruturas de dados (como listas) com o tipo mais generico. Assim, se em um sistema você precisar ter uma lista de pessoas que utilizam o mesmo... Caso haja essa relação (seja através de herança ou Interface), você poderá adicionar funcionarios, clientes, fornecedores sem problema (já que todos são pessoas na sua forma mais generica). :)

Jair, acho que estou começando a entender o propósito referente à minha dúvida agora... será que poderia dar um exemplo onde declarar:

Conta cc = new ContaCorrente();

traria um benefício?

solução!

Leandro, dessa forma você poderia, por exemplo, atribuir à variável cc uma instância da classe ContaPoupanca() em algum outro momento do código, uma vez que o objeto é do tipo Conta e não ContaCorrente. Meio difícil um cenário que faria isso, mas pense que você poderia declarar o objeto simplesmente como Conta cc; e fosse definir que tipo de conta de acordo com um dado fornecido pelo usuário. Aí verificaria o que o usuário enviou e, de acordo com o que ele escolheu, faria cc = new ContaCorrente(); ou cc = new ContaPoupanca();, por exemplo. Poderiam ter vários outros tipos de contas, porém a declaração do objeto cc lá em cima continua o mesmo e apenas um.

Valeu Bruno, clareou bastante agora. É comum usar esse tipo de recurso no dia-a-dia ou é algo que fica mais na teoria?

Bons desenvolvedores com certeza utilizam. O problema é que o que você mais vê por aí são sistemas legados, onde muitas vezes foram feitos na coxa por conta de correria ou desleixo. Você saindo com essa base decente vai se assustar com o que ver e vai querer mudar o mundo, porém infelizmente não dá pra ficar mexendo no core de aplicações legadas, onde seria melhor começar do zero, mas provavelmente não vão querer isso. Enfim, não usar dessa forma também funciona, porém dessa forma faz muito mais sentido, fica muito mais elegante e você deixa tudo mais organizado.