No exemplo a seguir as classes ContaCorrente e ContaPoupanca tem taxas de saque diferentes. Por essa razão os métodos saca() são sobrescritos em cada uma das classes. Quando executo o método saca() a taxa de saque é cobrada normalmente. Porém quando executo o método transfere() que utiliza o método saca() a taxa de saque é desconsiderada. Como resolver esta situação ?
Utilizo a classe Movimentacoes em composicao com as classes Conta. O que eu notei no debug é que quando tento fazer uma transferência, o método transfere() chama o método saca da própria classe Movimentações e não da respectiva Classe conta, onde é tratada a taxa de saque.
public class ContaCorrente implements Conta, Tributavel{
private Movimentacoes movimentacoes;
public ContaCorrente (int agencia, int numero) {
movimentacoes = new Movimentacoes (agencia, numero);
}
@Override
public void saca(double valor) {
double valorASacar = valor + 0.2;
movimentacoes.saca(valorASacar);
}
@Override
public void deposita(double valor) {
movimentacoes.deposita(valor);
}
@Override
public double getValorImposto() {
return movimentacoes.getSaldo() * 0.1;
}
@Override
public double getSaldo() {
return movimentacoes.getSaldo();
}
@Override
public void transfere(double valor, Conta destino) {
movimentacoes.transfere(valor, destino);
}
/*@Override
public void setSaldo(double valor) {
movimentacoes.setSaldo(valor);
}*/
}
public class ContaPoupanca implements Conta, Tributavel{
private Movimentacoes movimentacoes;
public ContaPoupanca (int agencia, int numero) {
movimentacoes = new Movimentacoes (agencia, numero);
}
@Override
public void saca(double valor) {
double valorASacar = valor + 0.5;
movimentacoes.saca(valorASacar);
}
@Override
public void deposita(double valor) {
movimentacoes.deposita(valor);
}
@Override
public double getValorImposto() {
return movimentacoes.getSaldo() * 0.1;
}
@Override
public double getSaldo() {
return movimentacoes.getSaldo();
}
@Override
public void transfere(double valor, Conta destino) {
movimentacoes.transfere(valor, destino);
}
/*@Override
public void setSaldo(double valor) {
movimentacoes.setSaldo(valor);
}*/
}
public class Movimentacoes {
private int agencia;
private int numero;
private double saldo;
private Cliente titular;
public Movimentacoes(int agencia, int numero) {
this.agencia = agencia;
this.numero = numero;
this.saldo = 0;
System.out.println("Estou criando uma conta " + this.numero);
}
public void saca(double valor) {
if (this.saldo < valor) {
throw new SaldoInsuficienteException("Saldo: " + this.saldo +", Valor: " + valor);
}
this.saldo -= valor;
}
public void deposita(double valor) {
this.saldo += valor;
}
public void transfere(double valor, Conta destino) {
this.saca(valor);
destino.deposita(valor);
}
/*public void setSaldo(double saldo) {
this.saldo = saldo;
}*/
public double getSaldo() {
return saldo;
}
public void setTitular(Cliente titular) {
this.titular = titular;
}
public Cliente getTitular() {
return titular;
}
}