Help! Sobre Polimorfismo!

5 respostas
Mr_Smith
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!!

5 Respostas

renzonuccitelli

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.

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.

Mr_Smith

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.

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!

renzonuccitelli

Vão os exemplos:

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<Conta> 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());
	}

}

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.

Mr_Smith
renzonuccitelli:
Vão os exemplos:
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<Conta> 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());
	}

}

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.

Valew Muito obrigado!!!!!!!!!!!!!!!!!!!!!! Pelas dicas

Criado 27 de setembro de 2008
Ultima resposta 30 de set. de 2008
Respostas 5
Participantes 2