Eu decidi que o valor descontado é importante pro bytebank e que este precisa ser contabilizado e, dependendo do tipo de Conta, teria uma taxa diferente. A partir daí decidi escrever pela classe mãe Conta e por herança alcançar a ContaCorrente e a ContaPoupança.
Na classe Conta eu adicionei dois atributos (taxa e lucroTaxas) e dois métodos (setTaxa e getLucroTaxas). Também modifiquei o método saca (este é responsável pela movimentação, tanto como sacar quanto transferir).
public class Conta {
// atributos omitidos
private double taxa;
private static double lucroTaxas = 0;
public static double getLucroTaxas() {
return lucroTaxas;
}
public void setTaxa(double taxa) {
this.taxa = taxa;
}
public boolean saca (double valor) {
if(this.saldo >= valor) {
this.saldo -= (valor + taxa); //taxa adicionada
Conta.lucroTaxas += taxa; // soma das taxas
return true;
} else {
return false;
}
}
//código restante
No código das subclass eu modifiquei o método saca, tirando o código que adiciona o valor a sacar e setando uma taxa no lugar
public class ContaPoupanca extends Conta {
//omitido
public boolean saca(double valor) {
this.setTaxa(0.5);
return super.saca(valor);
}
}
public class ContaCorrente extends Conta {
//omitido
public boolean saca(double valor) {
this.setTaxa(0.3);
return super.saca(valor);
}
}
O código está funcional, descontando certinho conforme a taxa do tipo do objeto (0.3 e 0.5), independente se o tipo da referencia for a classe mãe. A classe de teste escrevi assim:
public class TesteContas {
public static void main(String[] args) {
//saque de conta poupanca
ContaPoupanca c1 = new ContaPoupanca(000, 00000);
c1.deposita(50.0);
c1.saca(10.0);
System.out.println("C1: " + c1.getSaldo());
System.out.println("lucro com uma movimentação: " + Conta.getLucroTaxas());
//transferencia de conta corrente
ContaCorrente cc = new ContaCorrente(111, 1111);
cc.deposita(100.0);
ContaPoupanca cp = new ContaPoupanca(222, 2222);
cp.deposita(200.00);
cc.transfere(10.0, cp);
System.out.println("CC: " + cc.getSaldo());
System.out.println("CP: " + cp.getSaldo());
System.out.println("lucro com duas movimentacoes: " + Conta.getLucroTaxas());
}
}
e o console imprime:
C1: 39.5
lucro com uma movimentação: 0.5
CC: 89.7
CP: 210.0
lucro com duas movimentacoes: 0.8
Entretanto se eu criar um objeto do tipo Conta() eu não teria taxa quando o método saca fosse chamado. Quando eu chamei o setTaxa() dentro do método saca() na classe mãe bagunçou tudo e as classes filhas começaram a usar a taxa da mãe. Uma solução que eu testei e funcionou foi atribuir um valor para taxa na hora da declaração do atributo taxa e não chamar o setTaxa na classe mãe, só nas filhas, e ficou funcional. Será que teria outra forma de colocar a taxa da class Conta usando o setTaxa()?