2
respostas

Não consigo privar uma variável .

Na atividade do desafio do pacote java-aplicando-orientacao-objetos, topico 3 reaproveitando caracteristica e comportamento , surgiu um incomodo nessa atividade :

Crie uma classe ContaBancaria com métodos para realizar operações bancárias como depositar(), sacar() e consultarSaldo(). Em seguida, crie uma subclasse ContaCorrente que herda da classe ContaBancaria. Adicione um método específico para a subclasse, como cobrarTarifaMensal(), que desconta uma tarifa mensal da conta corrente.

pois o sistema fica vulneravel , porque a pessoal pode alterar diretamente a varialvel do saldo da contaBancaria ao criar um objeto da conta corrente que herda o saldo da conta bancario entendi. Eu gostaria de alterar esse saldo só apenas com o metódo do deposito .

isso que acontece :


public class TestaContaBancaria {
   
   public static void main(String[] args) {
       
       ContaCorrente contaCorrente1 = new ContaCorrente();

        contaCorrente1.consultarSaldo();
        contaCorrente1.deposita(5000);
        contaCorrente1.deposita(5000);
        contaCorrente1.saque(5000);
        contaCorrente1.cobrarTarifaMensal();
        contaCorrente1.consultarSaldo();
        contaCorrente1.consultarSaldo();
        contaCorrente1.valorDaConta = 100; 
       
       





    }
}

public class ContaBancaria {
protected double valorDaConta ; 

    void  deposita(double dinheiro) {
        this.valorDaConta += dinheiro;
        System.out.println("Deposito realizado com sucesso, saldo atual: " + valorDaConta);
    }

    void saque(double dinheiro) {
        if (dinheiro <= valorDaConta) {
            this.valorDaConta -= dinheiro;
            System.out.println("Saque realizado com sucesso" + valorDaConta);
        }
        if (dinheiro > valorDaConta) {
            System.out.println("Saldo insuficiente para saque,  saldo atual  " + valorDaConta );
        }

    }

   void  consultarSaldo() {
       System.out.println("saldo atual " + valorDaConta);
    }


}

public class ContaCorrente extends ContaBancaria{

    private double tarifaMensalCorrente = 0.1;

    void cobrarTarifaMensal(){
        valorDaConta -= tarifaMensalCorrente;
        System.out.println("Tarifa " + tarifaMensalCorrente + "cobrada,  saldo atual " + valorDaConta);

    }
}

-> contaCorrente1.valorDaConta = 100; <- Eu não quero que isso aconteça , o valor entre apenas pelo metodo deposita, entendes ?

   Obs: Entendo que ao fazer isso , surgi o novo saldo *
   
   quando coloco o private na variavel ValorDaConta  na ContaBancaria  na minha ContaCorrente não consigo criar o metodo da tarifa , pois lá eu precisaria desse saldo para descontar e ter o saldo atual , quando coloco o protect entra no mesmo disconforto disso:  ->  contaCorrente1.valorDaConta = 100;   <- Eu não quero que isso aconteça , o valor entre apenas pelo metodo deposita, entendes ?
2 respostas

Oii Ivan, como vai você?

Para garantir que o saldo só possa ser modificado pelos métodos deposita() e saque(), e ainda permitir que a subclasse ContaCorrente utilize este saldo no método cobrarTarifaMensal(), você pode modificar a visibilidade da variável valorDaConta para private na classe ContaBancaria. Assim, ela não será acessível diretamente de fora das classes, nem mesmo pela subclasse.

Para permitir que a subclasse ContaCorrente ainda possa modificar o saldo (por exemplo, ao cobrar uma tarifa), você pode adicionar métodos protegidos na classe ContaBancaria que permitam modificar o saldo de maneira controlada. Esses métodos podem ser usados pela subclasse ContaCorrente mas não estarão disponíveis para o usuário final da classe.

Aqui está uma sugestão de como você pode reestruturar seu código:

public class ContaBancaria {
    private double valorDaConta; // Agora é privado

    public void deposita(double dinheiro) {
        this.valorDaConta += dinheiro;
        System.out.println("Deposito realizado com sucesso, saldo atual: " + valorDaConta);
    }

    public void saque(double dinheiro) {
        if (dinheiro <= valorDaConta) {
            this.valorDaConta -= dinheiro;
            System.out.println("Saque realizado com sucesso, saldo atual: " + valorDaConta);
        } else {
            System.out.println("Saldo insuficiente para saque, saldo atual: " + valorDaConta);
        }
    }

    public void consultarSaldo() {
        System.out.println("Saldo atual: " + valorDaConta);
    }

    // Método protegido para ajustar o saldo, acessível apenas dentro de classes no mesmo pacote ou subclasses
    protected void ajustarSaldo(double valor) {
        this.valorDaConta += valor;
    }
}

public class ContaCorrente extends ContaBancaria {
    private double tarifaMensalCorrente = 0.1;

    public void cobrarTarifaMensal() {
        ajustarSaldo(-tarifaMensalCorrente); // Utiliza o método protegido para ajustar o saldo
        System.out.println("Tarifa de " + tarifaMensalCorrente + " cobrada, saldo atual: " + valorDaConta);
    }
}

Neste código, a variável valorDaConta é privada e só pode ser modificada dentro da classe ContaBancaria ou por métodos que ela explicitamente permite (como o ajustarSaldo()). A classe ContaCorrente usa este método protegido para aplicar a tarifa mensal sem expor diretamente a variável valorDaConta.

Espero ter ajudado!

Caso surjam dúvidas, fico à disposição, ok?

Abraços e bons estudos!

Boa tarde Sara, tudo bem? no metodo cobrarTarifaMensal() no print do jeito que está concatenando com valorSaldo , essa variavél fica vermelho .

O que eu fiz: na super classe ContaBancaria criei um metodo gette na variavel valorSaldo e coloquei na classe filha , no metodo cobrarTarifa(), porém não concatenei apenas acrecentei esse metodo dentro do metodo cobrarTarifaMensal(). Também tirei o metodo consultar saldo não fazia mais sentido por razão de ter criado o metodo gette que já pega o saldo correto?

public class ContaCorrente extends ContaBancaria{

private double tarifaMensalCorrente = 0.1;

// void cobrarTarifaMensal(){ // valorDaConta -= tarifaMensalCorrente; // System.out.println("Tarifa " + tarifaMensalCorrente + "cobrada, saldo atual " + valorDaConta); // // }

void cobrarTarifaMensal() {

    ajustarSaldo(tarifaMensalCorrente);
    System.out.println("Tarifa de " + tarifaMensalCorrente + " cobrada");
    getValorDaConta();

}

}

public class ContaBancaria { private double valorDaConta ;

void  deposita(double dinheiro) {
    this.valorDaConta += dinheiro;
    System.out.println("Deposito realizado com sucesso, saldo atual: " + valorDaConta);
}

public void getValorDaConta() {
    System.out.println("Saldo atual " + valorDaConta);
}

void saque(double dinheiro) {
    if (dinheiro <= valorDaConta) {
        this.valorDaConta -= dinheiro;
        System.out.println("Saque realizado com sucesso" + valorDaConta);
    }
    if (dinheiro > valorDaConta) {
        System.out.println("Saldo insuficiente para saque,  saldo atual  " + valorDaConta );
    }

}


protected void ajustarSaldo(double valor) {
    this.valorDaConta -= valor;
}

}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software