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

Herança e precedencia

Olá, estou com uma dúvida no código abaixo. Estou usando as variáveis como privadas "#".

Eu quero que o saque da conta corrente tenha taxa, mas não quero que a transferencia da conta corrente para conta poupança tenha essa taxa.

O problema é que, o método "sacar" está na clases "Conta" e a classe "contaCorrente" usa esse método através do "super.sacar". Ou seja, mesmo que eu coloque uma taxa = 1 no método transferir da classe "Conta", esse método vai chamar o método sacar da classe "contaCorrente" que vai aplicar a taxa da conta corrente e com isso subscreve a taxa do método transferir.

Como eu faço para que funcione ? Eu já criei um método separado na classe "contaCorrente", mas não funciona para o método transferir.

Segue o código para vê se fica mais claro.

index.js

import {cliente} from "./cliente.js";
import {contaCorrente} from "./contaCorrente.js";
import {contaPoupanca} from "./contaPoupanca.js";

const cliente1 = new cliente("Joao", parseInt('08876678998'), 123123123);
const cliente2 = new cliente("Maria", parseInt('2933327763'), 65589669);

const novaContaCorrente1 = new contaCorrente(8023, cliente1);
const novaContaPoupanca1 = new contaPoupanca(8023, cliente1, 0);
const novaContaCorrente2 = new contaCorrente(8023, cliente2);

novaContaCorrente1.depositar(500);
novaContaCorrente1.sacar(100);
novaContaPoupanca1.depositar(300);
novaContaCorrente1.transferir(40, novaContaPoupanca1);

Conta.js

import {cliente} from "./cliente.js";
export class Conta{
    #saldo;
    #cliente;
    #sacar

    constructor(agencia, cliente, saldo){
        this.agencia = agencia;
        this.alteracliente = cliente;
        this.alterasaldo = saldo;
    }

    set alteracliente(novoValor){
        if(novoValor instanceof cliente){
            this.#cliente = novoValor;
        }
    }
    set alterasaldo(novoSaldo){
        this.#saldo = novoSaldo;
    }

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

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

    sacar(valor, taxa){
        valor *= taxa;
        console.log("Fui chamado - Conta")
        if(this.#saldo >= valor){
            this.#saldo -= valor;
            return valor;           
        }
        return 0;
    } 

    depositar(valor){
        if(valor <= 0){
            return;         
        }
        this.#saldo += valor;
    }

     transferir(valor, conta){
        let taxa = 1;
        const valorSacado = this.sacar(valor, taxa);
        conta.depositar(valorSacado);   

    } 
}

contaCorrente.js

import { Conta } from "./Conta.js";

export class contaCorrente extends Conta{
    static numeroDeContas = 0;
    constructor(agencia, cliente){
        super(agencia, cliente, 0);
        contaCorrente.numeroDeContas += 1;
        }

    //Só funciona se for chamado diretamente.
      /*sacarContaCorrente(valor){
            let taxa = 1.1;
            return super.sacar(valor, taxa);
        }*/

    // Funciona com o método transferir da classe Conta
    sacar(valor){
            let taxa = 1.1;
            return super.sacar(valor, taxa);
        }
}
4 respostas

Esqueci de perguntar. Tem alguma instrução parecida com "instanceof" para método ? Porque eu poderia usar no método sacar sem precisar criar um if.

Fala ai Elton, tudo bem? Nesse caso você vai precisar sobrescrever o método saca dentro da clase ContaCorrente, o problema é que o JavaScript ainda não tem suporte a protected fields.

Então vai precisar repetir os atributos dentro da ConteCorrente para usá-los.

Infelizmente o JS puro ainda possuí algumas limitações em relação a orientação à objetos, normalmente quando precisamos de tais recursos, acabamos utilizando o TypeScript (além de outros motivos).

Espero ter ajudado.

Matheus tudo bem ? Obrigado pela resposta. Eu vi isso hoje, que tem como sobrescrever o método. Me tira uma dúvida. To usando o nodejs 12.17.0, e quando uso as variáveis com #, elas ficam privadas, isso ainda não está oficialmente sendo usado ? Eu vi que era uma intenção, mas isso já faz tempo. Outra dúvida, eu consigo criar um método privado ? Olha só, eu posso está entendendo errado, mas segundo o instrutor, a convenção diz, que o que estiver com "_sacar" é privado. Mas ele usa isso num método. Porém, se eu for usar "#sacar" em um método, dá erro.

Abaixo é como está no curso. Ou seja, pra linguagem nada disso é privado. Isso é uma conversão dos programadores, e desta forma funciona.

Grato pela ajuda.

 sacar(valor){

    }

    _sacar(valor, taxa){
        valor *= taxa
        console.log("Fui chamado - Conta")
        if(this.#saldo >= valor){
            this.#saldo -= valor;
            return valor;           
        }
        return 0;
    } 
solução!

Fala ai Elton, tudo bem? Na versão 12.7.0 acho que ainda não tem suporte nativo, tente usar a 14.x, se não rolar também vai ser necessário um processo de transpilar esse código novo/moderno para algo mais antigo.

Na verdade o "_sacar" não vai deixar o método privado, é apenas uma convenção que a comunidade do JavaScript adotou para "imitar" funções privadas (isso porque ele nativamente não tem suporte).

Para que a função também seja privada, pasta declará-la com o # igual nas propriedades:

#minhaFuncao() {}

Espero ter ajudado.