Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

não consigo acessar o método privado #sacar

Não estou conseguindo acessar o método privado #sacar... Insira aqui a descrição dessa imagem para ajudar na acessibilidade

codigo no meu conta.js

'use strict'

export class Conta {

    #saldo = 0
    #cliente
    #agencia

    constructor(saldoInicial, cliente, agencia) {
        this.#saldo = saldoInicial
        this.#cliente = cliente
        this.#agencia = agencia
    }

    set cliente(novoValor) {
        if (novoValor instanceof Cliente)
            this.#cliente = novoValor
    }

    get cliente() {
        return this.#cliente
    }

    get saldo() {
        return this.#saldo;
    }

    sacar(valor) {
        let taxa = 1
        console.log("chegou 3")

        return this.#sacar(valor, taxa)
    }

    #sacar(valor, taxa) {
        const valorSacado = taxa * valor
        console.log(taxa)

        if (this.#saldo >= valorSacado) {
            this.#saldo -= valorSacado
            console.log("chegou 2")

            return valorSacado
        }
        console.log("chegou 1")

        return 0
    }

    depositar(valor) {
        if (valor < 0) return;

        this.#saldo += valor
    }

    transferir(valor, conta) {
        const valorSacado = this.sacar(valor);
        conta.depositar(valorSacado);
    }

}
3 respostas

Oi Jian!

Métodos privados só podem ser acessados pela classe em que foram declarados, ou seja, apenas Conta pode utilizar o #sacar. Classes derivadas, como o ContaCorrente, devem utilizar o método público sacar, sem o #.

Espero ter ajudado! Se tiver mais alguma dúvida, pode postar aqui!

Tudo bem, entendi, ate faz mais sentido, a questão é q o metodo é usado pra diferenciar os tipos de saque (cada tipo de saque tem uma taxa diferente), mas quando qualquer tipo de conta que eu esteja criando, a taxa sera subistituido por 1, que é o valor que esta declarado na inicialização da função...

solução!

Oi Jian!

Neste caso temos que usar métodos protected. Ao contrário de métodos private, eles podem ser utilizados pelas classes filhas.

Linguagens como C# e Java possuem a palavra reservada protected, entretanto o JavaScript não possui esse comportamento nativamente. Até mesmo o # dos métodos privados é uma funcionalidade experimental e que não funciona em todos os ambientes.

Por convenção, métodos com _ antes do nome são entendidos como protected e só devem ser acessados pelas propria classe ou classes filhas. Como dito, é apenas uma convenção, não há nada que enforce essa formatação.

No seu código, você utilizou a sintaxe super.#sacar(valor, taxa), mas ao utilizar mudar de private para protected a sintaxa será this._sacar(valor, taxa), pois _sacar será herdado automaticamente em ContaCorrente.

Espero que tenha ficado claro. Infelizmente essa é uma das limitações do javascript ao utilizar a orientação à objetos.

Acabei não achando nenhum conteúdo muito aprofundado sobre isso em português, mas achei um artigo bacana em inglês sobre modificadores de acesso em javascript.

Bons estudos!