1
resposta

E se eu quiser que a taxa de 20 centavos seja cobrada apenas nos saques, e não nas transferências?

No caso do exemplo, transferimos 10 reais da Conta Corrente para a Conta Poupança, e foi cobrada a taxa de 20 centavos. E se eu não quiser que essa taxa seja cobrada em transferências, mas apenas em saques? Eu tenho que fazer Override também no método transfere? Usando o projeto das aulas, poderiam me mostrar como ficaria?

1 resposta

Cara, eu acredito que um método possível e provavelmente o correto para implementar uma taxa de 20 centavos sempre que alguém realizar um saque, é simplesmente alterar na classe mãe (superclass) o método de saque, colocando uma redução dessa taxa no saldo disponível antes ou depois da operação, a seu critério observando os if's necessários, pois como estamos trabalhando com herança e essa modificação também irá afetar automaticamente a Conta Corrente e a conta Poupança.

    public class Conta{

    public boolean saque (double saque) {
    if (this.saldo - saque - 0.2 < 0) {
    return false;
    } else {
    this.saldo -= saque;
    this.saldo -= 0.2;
    return true;
    }
    }
}

O erro que pode dar é devido ao uso do double, pois ele não é o melhor para indicar saldo, porque às vezes gera inúmeras casas decimais devido a complexas contas matemáticas trigonométricas e a conta não fica perfeita, mas de modo geral, atende bem nossas necessidades.

Se você quiser alterar em apenas uma determinada classe, por exemplo, que essa taxa fosse cobrada exclusivamente em saques da conta Corrente, nesse caso sim você teria que fazer esse overwrite na própria classe ContaCorrente, pois a implementação desse método vai ser específico dela, não realizando nenhuma alteração na classe mãe.

public class ContaCorrente {

@Override
public boolean saque(double saque) {
//Aqui modificaremos a implementação do método, que vai ser específico para essa classe 

    if (super.getSaldo() - saque - 0.2 <0) {
        System.out.println("Erro, saldo insuficiente");
        return false;

    } else {
        super.saque(saque + 0.2);
        //Aqui chamamos o método saque da classe mãe e acrescentamos 0.2, que seriam os 20 centavos a mais cobrados como taxa!
        return true;
    }

Neste caso, só é possível resolver assim pois na classe mãe, trabalhei os métodos utilizando os próprios atributos, observe bem que o professor para criar o método get.Saldo, por exemplo, utiliza o próprio atributo pelo "this.saldo" , de igual modo podemos trabalhar nos demais métodos, haja vista que mesmo tendo os atributos como sendo privados, eles podem ser usados na classe em questão para construir métodos que as representarão fora da classe, que é justamente onde não queremos que eles sejam diretamente alterados! Dentro dela, não há problema em utilizá-los para construir os métodos e evita situações de entrave como não conseguir cobrar a taxa em apenas um, pois o método mais específico sempre será chamado!

Melhor forma de descrever o transfere na classe mãe para fugir da correlação com o "saca" e evitar cobrar a taxa:

    public class Conta{

    public void transfere(double transfere, Conta destino) {
    if (transfere < 0.01 || transfere > saldo) {
        System.out.println("Erro, saldo insuficiente ou não é possível transferir menos de 1 centavo!");
    } else {
        this.saldo -= transfere;
        destino.deposita(transfere);

    }
}
}

Se você fizer um override no método transfere não resolverá o problema, pois terá que trabalhar com o método saca, haja vista que não tem acesso aos atributos e o único método que conta para retirar dinheiro é o saca (o mais específico), e a taxa seria cobrada. Se você pensar em criar um outro método para tentar solucionar, nele você trabalharia com os atributos da classe, então faz mais sentido realizar essa alteração diretamente no método transfere.