Duvida com Poliformismo e Herança[RESOLVIDO]

2 respostas
F

Bom dia Galera!
Estou fazendo os exercicios de poliformismo e herança da apostila da Caelum fj-11 e há o seguinte exercicio:

6) (opcional) Vamos criar uma classe que seja responsável por fazer a atualização de todas as contas
bancárias e gerar um relatório com o saldo anterior e saldo novo de cada uma das contas.

class AtualizadorDeContas {
private double saldoTotal = 0;
private double selic;
AtualizadorDeContas(double selic) {
this.selic = selic;
}
void roda(Conta c) {
// aqui voce imprime o saldo anterior, atualiza a conta,
// e depois imprime o saldo final
// lembrando de somar o saldo final ao atributo saldoTotal
}
// outros métodos, colocar o getter para saldoTotal!
}

7) (opcional) No método main, vamos criar algumas contas e rodá-las:

class TestaAtualizadorDeContas {
public static void main(String[] args) {
Conta c = new Conta();
Conta cc = new ContaCorrente();
Conta cp = new ContaPoupanca();
c.deposita(1000);
cc.deposita(1000);
cp.deposita(1000);
AtualizadorDeContas adc = new AtualizadorDeContas(0.01);
adc.roda(c);
adc.roda(cc);
adc.roda(cp);
System.out.println("Saldo Total: " + adc.getSaldoTotal());
}
}

8) (Opcional) Use a palavra chave super nos métodos atualiza reescritos, para não ter de refazer o trabalho.

eis minhas classes e o main

class Conta{
	protected double saldo;
	
	void deposita(double valor){
		this.saldo += valor;
	}
	
	void saca(double valor){
		this.saldo -= valor;
	}
	
	double getSaldo(){
		return this.saldo;
	}
	
	void atualiza(double taxa){
		this.saldo += this.saldo * taxa;
	}
}

class ContaCorrente extends Conta {
	void atualiza(double taxa){
		this.saldo += this.saldo * (2*taxa);
	}
	
	void deposita(double valor){
		this.saldo += valor - 0.10;
	}	
	
}

class ContaPoupanca extends Conta{
	void atualiza(double taxa){
		this.saldo += this.saldo * (3*taxa);
	}
}
class AtualizadorDeContas extends Conta{
	private double saldoTotal = 0;
	private double selic;
	
	AtualizadorDeContas(double selic){
		this.selic = selic;
	}
	
	void roda(Conta c){
		double d;
		System.out.println("Saldo Anterior: "+ c.getSaldo());
		super.atualiza(this.selic);
		System.out.println("Saldo Final: "+c.getSaldo());
		setSaldoTotal(c.getSaldo());
	}
	
	public double getSaldoTotal(){
		return this.saldoTotal;
	}
	
	public void setSaldoTotal(double valor){
		this.saldoTotal += valor;
	}
}


public class TestaAtualizadorDeContas {
	public static void main(String[] args){
		Conta c = new Conta();
		Conta cc = new ContaCorrente();
		Conta cp = new ContaPoupanca();
		
		c.deposita(1000);
		cc.deposita(1000);
		cp.deposita(1000);
		
		AtualizadorDeContas adc = new AtualizadorDeContas(0.01);
		
		adc.roda(c);
		adc.roda(cc);
		adc.roda(cp); 
			
		System.out.println("Saldo Total: " + adc.getSaldoTotal());
	}
}

O que está ocorrendo é o seguinte ao depositar era para se retirar 0.10 do valor deposistado porem nao está ocorrendo e o método roda não está funcionando corretamente, pois quando chamo osuper.atualiza ele não age de acordo com a conta escolhida, alguem poderia me auxiliar neste exercicio?

Desde já agardeço
T+

2 Respostas

Rafael_Mesquita_Mour
class Conta{  
    protected double saldo;  
      
    void deposita(double valor){  
        this.saldo += valor;  
    }  
      
    void saca(double valor){  
        this.saldo -= valor;  
    }  
      
    double getSaldo(){  
        return this.saldo;  
    }  
      
    void atualiza(double taxa){  
        this.saldo += this.saldo * taxa;  
    }  
}  
  
class ContaCorrente extends Conta {  
    void atualiza(double taxa){  
        this.saldo += this.saldo * (2*taxa);  
    }  
      
    void deposita(double valor){  
        this.saldo += valor - 0.10;  
    }     
      
}  
  
class ContaPoupanca extends Conta{  
    void atualiza(double taxa){  
        this.saldo += this.saldo * (3*taxa);  
    }  
}
8. (Opcional) Use a palavra chave super nos métodos atualiza reescritos, para não ter de refazer o trabalho. Você está fazendo exatamente o contrário que o exercício está pedindo. Em cada classe que estende conta, você deveria fazer algo como:
void atualiza(double taxa){
    this.saldo += (super.atualiza(taxa)) * 3;
}
Não sei se você entendeu corretamente a utilização de super.nomeDoMétodo(). Ele invoca o método da Superclasse, ou seja, nesse caso ele está invocando o método void atualiza(double taxa) da classe Conta.

Outro detalhe importante é que a sua classe AtualizadorDeContas também estende Conta, ou seja, ela também herda os métodos da classe Conta. Retire o extends Conta da classe AtualizadorDeContas e invoque o método roda() da seguinte forma:

void roda(Conta c){  
        double d;  
        System.out.println("Saldo Anterior: "+ c.getSaldo());  
        c.atualiza(this.selic);  
        System.out.println("Saldo Final: "+c.getSaldo());  
        setSaldoTotal(c.getSaldo());  
    }

Corrijam-me se estiver errado.

F
Rafael Mesquita Moura:
class Conta{  
    protected double saldo;  
      
    void deposita(double valor){  
        this.saldo += valor;  
    }  
      
    void saca(double valor){  
        this.saldo -= valor;  
    }  
      
    double getSaldo(){  
        return this.saldo;  
    }  
      
    void atualiza(double taxa){  
        this.saldo += this.saldo * taxa;  
    }  
}  
  
class ContaCorrente extends Conta {  
    void atualiza(double taxa){  
        this.saldo += this.saldo * (2*taxa);  
    }  
      
    void deposita(double valor){  
        this.saldo += valor - 0.10;  
    }     
      
}  
  
class ContaPoupanca extends Conta{  
    void atualiza(double taxa){  
        this.saldo += this.saldo * (3*taxa);  
    }  
}
8. (Opcional) Use a palavra chave super nos métodos atualiza reescritos, para não ter de refazer o trabalho. Você está fazendo exatamente o contrário que o exercício está pedindo. Em cada classe que estende conta, você deveria fazer algo como:
void atualiza(double taxa){
    this.saldo += (super.atualiza(taxa)) * 3;
}
Não sei se você entendeu corretamente a utilização de super.nomeDoMétodo(). Ele invoca o método da Superclasse, ou seja, nesse caso ele está invocando o método void atualiza(double taxa) da classe Conta.

Outro detalhe importante é que a sua classe AtualizadorDeContas também estende Conta, ou seja, ela também herda os métodos da classe Conta. Retire o extends Conta da classe AtualizadorDeContas e invoque o método roda() da seguinte forma:

void roda(Conta c){  
        double d;  
        System.out.println("Saldo Anterior: "+ c.getSaldo());  
        c.atualiza(this.selic);  
        System.out.println("Saldo Final: "+c.getSaldo());  
        setSaldoTotal(c.getSaldo());  
    }

Corrijam-me se estiver errado.

Eu reescreveria o metodo atualiza desta forma:

public void atualiza(double taxa) {
		super.atualiza(taxa * 3);
	}
Criado 2 de setembro de 2011
Ultima resposta 7 de abr. de 2013
Respostas 2
Participantes 3