Caelum(Resolvido)

7 respostas
denisspitfire

Pessoal, estou estudando a apostila da Caelum, e na página 80. exercicio 7.7, encontrei um problema. O capitulo mensiona herança, reescrita e polimorfismo. Na parte 3 do exercicio pede para criarmos duas subclasses, estou criando então em dois arquivos diferentes as classes ContaPoupanca e ContaCorrente. Até ai tudo bem, só nao entendi o do porque criar a reescrita do método deposita. Alguem ae sabe pq?

7 Respostas

rmendes08

ContaCorrente e ContaPoupanca devem ser subclasses de uma classe Conta mais genérica. O método deposita deve ser declarado na na classe Conta, pois todas as contas permitem que você deposite dinheiro, porém, para cada tipo de conta as operações de depósito podem ser diferentes. Por exemplo, na ContaCorrente pode ser cobrada uma pequena taxa por depósito, enquanto que na ContaPoupanca o depósito pode render juros ou somar pontos para alguma promoção.

denisspitfire

Ok, cheguei a esta conclusão mas não é exatamente a minha pergunta… o problema é que… se as classes “filhas” tem métodos próprios… porque a classe “mãe” precisa ter esse método de sacar ou depositar???

Exemplo…
Se java prefere as classes filhas. Considere o exemplo.
ContaCorrente tem método saca e deposita.
ContaPoupança tem método saca e deposita.
Conta tem método saca e deposita.

Considerando que… a conta poupança sempre vai depositar e sacar na sua propria classe e a corrente também… porque fazer um método na conta que nunca será acessado?

Não sei se eu viajei muito… mas acho que seria perda de tempo fazer um método que nunca vai ser acessado.

rmendes08

Não, não é viagem não. E é exatamente para isso que existem os métodos abstratos. Com métodos abstratos você apenas declara a assinatura do método, deixando a implementação para as classes filhas. Por exemplo:

abstract class Conta{
   abstract void saca(double valor) ;
   absrtact void deposita(double valor);
}

Com isso, você apenas força que as classes filhas não abstratas implementem esses métodos. Porém, dependendo do caso, é útil ter uma implementação padrão.

henriqueluz

Acho que você não entendeu o conceito de polimorfismo.
Vamos lá…

Com a herança você pode definir na assinatura de algum método um atributo do tipo Conta(classe-mãe) e dentro dela utilizar as operações que ela suporta.
E na chamada do método você pode passar um objeto do tipo ContaCorrente ou ContaPoupança neste método que em tempo de execução ele saberá qual operação correta chamar.
Percebeu a flexibilidade?

Vamos a um exemplo:

public class Conta {
	protected Double saldo = new Double("0");
	protected Double taxa = new Double("0");
	
	public Double getTaxa(){
		return this.taxa;
	}
	
	public Double getSaldo(){
		return this.saldo;
	}
}

public class ContaPoupanca extends Conta {
	
	@Override
	public Double getTaxa(){
		return new Double("0.12");
	}
	
}

public class ContaCorrente extends Conta {

	@Override
	public Double getTaxa(){
		return new Double("0.07");
	}
}

public class ControleDeContas {
	
	public Double calculaSaldoTotal(Conta conta){
                 //Levando em conta que o saldo já tenha sido setado como um valor > 0.
		Double saldoTotal = conta.getSaldo() + (conta.getSaldo() * conta.getTaxa()) ;
		return saldoTotal;
	}
}

Ao chamar o método calculaSaldoTotal, você pode passar tanto uma ContaCorrente quanto uma ContaPoupança e em tempo de execução a taxa correta será retornada.
Se não houvesse herança voce teria que criar dois métodos para cada tipo de conta.
E se tivessemos mais tipos de contas? Teriamos que criar mais e mais métodos.

Entendeu ai questão?

Não sei se esse exemplo foi tão bom, mas foi o que me veio na cabeça mais rápido. Abraos,

denisspitfire

ok, então pra fechar… vamos ver se eu entendi.
Caso… algum dia… tenha uma conta Vip, que ela nao tem o tal do saca e do deposita… ela vai contar o saca e deposita da mãe. Dai ela nao vai ficar com este problema… é só para remediar uma situação que talvez um programador esqueça ou até mesmo se ele nao implementar pois o saca e deposita dele é neutro ou igual o da classe mãe?

Mas isso é Polimorfismo? Certo? Onde posso usar isso também. Por exemplo em um jogo ou sei la.

henriqueluz

denisspitfire:
ok, então pra fechar… vamos ver se eu entendi.
Caso… algum dia… tenha uma conta Vip, que ela nao tem o tal do saca e do deposita… ela vai contar o saca e deposita da mãe. Dai ela nao vai ficar com este problema… é só para remediar uma situação que talvez um programador esqueça ou até mesmo se ele nao implementar pois o saca e deposita dele é neutro ou igual o da classe mãe?

Isso mesmo.

O polimorfismo consiste em diferentes comportamentos para um dado método, de acordo com a maneira que cada classe o implementa.

Você pode sim aplicar em um jogo, por ex. num jogo de Labirinto você pode definir diferentes tipos de comportamentos(Labirinto mágico, Labirinto fácil, Labirinto impossivel, etc…)

Existe uma infinidade de exemplos e o polimorfismo resolve uma infinidade deles.

Dá uma lida nesse artigo que ele pode clarear um pouco pra você:
http://www.arquiteturajava.com.br/livro/programe-voltado-a-interface-nao-a-implementacao.pdf

Na apostila da Caelum também explica bem claramente, dá uma olhada também.

Abs,

denisspitfire

Obrigado a todos. Vlw pelo esclarecimento.

Criado 24 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 7
Participantes 3