1
resposta

Contabilizar taxas na movimentação das contas

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()?

1 resposta

Oi Gabriel, tudo certo?

Então, nas classes filhas você tá chamando o método saca() da classe mãe (super.saca(valor)). Ou seja, dentro das classes filhas você setou a taxa mas tá usando o método saca() da classe mãe... e na classe mãe (Conta) no código que você mandou não possui nenhum valor de taxa.

Em relação á adicionar a taxa, você poderia incluir no construtor da classe Conta um parâmetro que recebe a taxa. Mas isso implicaria repassa-los nas classes filhas também.

Espero ter ajudado.