Help! Sobre Polimorfismo!

Considerando em Java uma classe com a seguinte estrutura:
➔ Classe Conta:
➔ public float dinheiro;
➔ public void inserirDinheiro(float dinheiro);
➔ public float retirarDinheiro();
➔ public float mostrarDinheiro().
Com duas classes ? Corrente e Poupanca ? que estendam essa classe. Corrente tem
método para executar sua taxa de manutenção; Poupança tem método para sua taxa de rendimento.

Usando as classes da pergunta anterior, como seria em Java um método principal que instancie um
arranjo com objetos da classe Conta. Depois, com uma repetição, como o usuário escolhe se cada objeto será
corrente ou poupança?

Minha dúvida é como seria com polimorfismo!

Valew Moçada pela Atenção!!

A idéia é vc usar somente a classe conta para fazer inserções, retiradas ou para mostrar o extrato.
Se ela é CC ou poupança, vc não precisaria saber.

Na criação dos objetos vc que decide qual tipo de conta será criada, usando o respectivo construtor, implementando os métodos que deseja, como taxa de manutenção.

Pelo menos respondi o que entendi do que vc explicou.

Ah, como exemplo, suponha que vc fosse o gerente e kisesse ver o saldo de várias contas, sejam elas poupança ou CC, vc poderia ter uma lista de contas e adicionar a essa lista as instancias de CC ou poupança que desejasse ver, e depois bastaria chamar mostrarDinheiro() para ver todos os extratos, sem precisar saber se a conta é CC ou poupança…

Espero ter ajudado.

[quote=renzonuccitelli]Ah, como exemplo, suponha que vc fosse o gerente e kisesse ver o saldo de várias contas, sejam elas poupança ou CC, vc poderia ter uma lista de contas e adicionar a essa lista as instancias de CC ou poupança que desejasse ver, e depois bastaria chamar mostrarDinheiro() para ver todos os extratos, sem precisar saber se a conta é CC ou poupança…

Espero ter ajudado.[/quote]

Me ajudou e muito!! Valew Mesmo!!
Estou com dificuldades com a estrutura…vc poderia me dar um exemplo…?
é pq é provavel que caia na prova pratica e preciso de uma orientação .
Valew!! Thanks!

Vão os exemplos:

[code]public abstract class Conta {
public float dinheiro;

 public Conta() {
	
	this.dinheiro = 0;
}
public void inserirDinheiro(float dinheiro){
	 this.dinheiro+=dinheiro;
 }
 public void retirarDinheiro(float dinheiro){
	 this.dinheiro-=dinheiro;
 }
 public float mostrarDinheiro(){
	 return this.dinheiro;
 }
 
 public abstract void atualizarConta();

}

public class ContaCorrente extends Conta {
private float taxaJuros;
public ContaCorrente(float taxaManutencao) {
super();
this.taxaJuros=taxaManutencao;
}

@Override
public void atualizarConta() {
	this.inserirDinheiro(this.mostrarDinheiro()*taxaJuros);
	
}

}

public class ContaPoupanca extends Conta {
private float taxaManutencao;
public ContaPoupanca(float taxaManutencao) {
super();
this.taxaManutencao=taxaManutencao;
}

@Override
public void atualizarConta() {
	this.retirarDinheiro(taxaManutencao);
	
}

}

public class Banco {
private List listaContas;

public Banco() {
	listaContas=new LinkedList<Conta>();
}

public void adicionarContaPoupanca(float depositoInicial){
	ContaPoupanca poupanca=new ContaPoupanca((float)0.65);
	poupanca.inserirDinheiro(depositoInicial);
	listaContas.add(poupanca);
}

public void adicionarContaCorrente(float depositoInicial){
	ContaCorrente poupanca=new ContaCorrente((float)15);
	poupanca.inserirDinheiro(depositoInicial);
	listaContas.add(poupanca);
}

public String imprimirExtratoTodasContas(){
	StringBuilder extratos=new StringBuilder();
	for(Conta conta: listaContas){
		extratos.append(conta.getClass().getName()+"\n");
		extratos.append(conta.mostrarDinheiro()+"\n");
	}
	return extratos.toString();
}

public void atualizarContas(){
	for(Conta conta: listaContas){
		conta.atualizarConta();
	}
}

}

public class BancoTeste {

/**
 * @param args
 */
public static void main(String[] args) {
	Banco banco=new Banco();
	banco.adicionarContaCorrente(25);
	banco.adicionarContaPoupanca(32);
	banco.adicionarContaCorrente((float) 55.09);
	banco.adicionarContaPoupanca((float) 567.98);
	System.out.println(banco.imprimirExtratoTodasContas());
	banco.atualizarContas();
	System.out.println("Atualizando contas...");
	System.out.println(banco.imprimirExtratoTodasContas());
}

}
[/code]

No início é normal ter dificuldade com Herança, o que vc tem que ter em mente é o seguinte:
Toda subclasse faz tudo que a superclasse faz, e geralmente, mais algumas coisas. Quando vc achar que um método vai ter que ser implementado de forma diferente em cada uma das subclassses, faça a superclasse abstrata, criando um nome geral para o método a ser implementado (no caso, criei um atualizar conta).

Assim, vc pode ver que se vc kiser criar outro tipo de conta, basta extender a classe Conta e implementar o método atualizar conta como desejar. Assim, vc só precisaria criar outro método adicionar na classe banco, ou criar um método adicionar na Classe banco que levasse uma instancia de banco, ficando ainda mais geral do que eu fiz. Assim, vc poderia criar outras contas sem mexer nas suas classe já criadas.

Assim, o macete que vc tem que ter em mente é: colocar na superclasse os métodos mais gerais que vc vai precisar.
Se achar que precisaram implementar métodos de forma diferente, faça a superclasse abstrato com o método abstrato, deixando assim a implementação para as subclasses.

Espero ter conseguido explicar, apesar de didática não ser o meu forte.

[quote=renzonuccitelli]Vão os exemplos:

[code]public abstract class Conta {
public float dinheiro;

 public Conta() {
	
	this.dinheiro = 0;
}
public void inserirDinheiro(float dinheiro){
	 this.dinheiro+=dinheiro;
 }
 public void retirarDinheiro(float dinheiro){
	 this.dinheiro-=dinheiro;
 }
 public float mostrarDinheiro(){
	 return this.dinheiro;
 }
 
 public abstract void atualizarConta();

}

public class ContaCorrente extends Conta {
private float taxaJuros;
public ContaCorrente(float taxaManutencao) {
super();
this.taxaJuros=taxaManutencao;
}

@Override
public void atualizarConta() {
	this.inserirDinheiro(this.mostrarDinheiro()*taxaJuros);
	
}

}

public class ContaPoupanca extends Conta {
private float taxaManutencao;
public ContaPoupanca(float taxaManutencao) {
super();
this.taxaManutencao=taxaManutencao;
}

@Override
public void atualizarConta() {
	this.retirarDinheiro(taxaManutencao);
	
}

}

public class Banco {
private List listaContas;

public Banco() {
	listaContas=new LinkedList<Conta>();
}

public void adicionarContaPoupanca(float depositoInicial){
	ContaPoupanca poupanca=new ContaPoupanca((float)0.65);
	poupanca.inserirDinheiro(depositoInicial);
	listaContas.add(poupanca);
}

public void adicionarContaCorrente(float depositoInicial){
	ContaCorrente poupanca=new ContaCorrente((float)15);
	poupanca.inserirDinheiro(depositoInicial);
	listaContas.add(poupanca);
}

public String imprimirExtratoTodasContas(){
	StringBuilder extratos=new StringBuilder();
	for(Conta conta: listaContas){
		extratos.append(conta.getClass().getName()+"\n");
		extratos.append(conta.mostrarDinheiro()+"\n");
	}
	return extratos.toString();
}

public void atualizarContas(){
	for(Conta conta: listaContas){
		conta.atualizarConta();
	}
}

}

public class BancoTeste {

/**
 * @param args
 */
public static void main(String[] args) {
	Banco banco=new Banco();
	banco.adicionarContaCorrente(25);
	banco.adicionarContaPoupanca(32);
	banco.adicionarContaCorrente((float) 55.09);
	banco.adicionarContaPoupanca((float) 567.98);
	System.out.println(banco.imprimirExtratoTodasContas());
	banco.atualizarContas();
	System.out.println("Atualizando contas...");
	System.out.println(banco.imprimirExtratoTodasContas());
}

}
[/code]

No início é normal ter dificuldade com Herança, o que vc tem que ter em mente é o seguinte:
Toda subclasse faz tudo que a superclasse faz, e geralmente, mais algumas coisas. Quando vc achar que um método vai ter que ser implementado de forma diferente em cada uma das subclassses, faça a superclasse abstrata, criando um nome geral para o método a ser implementado (no caso, criei um atualizar conta).

Assim, vc pode ver que se vc kiser criar outro tipo de conta, basta extender a classe Conta e implementar o método atualizar conta como desejar. Assim, vc só precisaria criar outro método adicionar na classe banco, ou criar um método adicionar na Classe banco que levasse uma instancia de banco, ficando ainda mais geral do que eu fiz. Assim, vc poderia criar outras contas sem mexer nas suas classe já criadas.

Assim, o macete que vc tem que ter em mente é: colocar na superclasse os métodos mais gerais que vc vai precisar.
Se achar que precisaram implementar métodos de forma diferente, faça a superclasse abstrato com o método abstrato, deixando assim a implementação para as subclasses.

Espero ter conseguido explicar, apesar de didática não ser o meu forte.[/quote]

Valew Muito obrigado!!! Pelas dicas