1
resposta

Quando vou usar a classe sacar() ?

No exemplo realizado pelo professor, a classe sacar() perdeu seu uso na classe ContaCorrente.

Classe mãe Conta.js :

export class Conta { //Criando método construtor //declarando seus parâmetros constructor(saldoInicial, cliente, agencia) { //Iniciando as propriedades dentro do construtor //"saldo" significa que será privado (por convenção, não por definição) 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;
    return this._sacar(valor, taxa);
}

//Método privado
_sacar(valor, taxa) {
    const valorSacado = taxa * valor;
    if(this._saldo >= valorSacado){
        this._saldo -= valorSacado;
        return valorSacado;
    }
    return 0;
}

depositar(valor){
    this._saldo += valor;           
}

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

}

Classe filha ContaCorrente.js :

import { Conta } from "./Conta.js"; /* "extends" O JS por trás vai pegar tudo que está na classe conta e trazer pra cá, como se o código estivesse escrito aqui. / export class ContaCorrente extends Conta{ static numeroDeContas = 0; constructor(cliente, agencia) { //"super" palavra especial que chama o construtor da classe mãe a "conta.js para a classe filha a "ContaCorrente.js" //saldo, cliente, agencia / Sempre que a sua classe for uma subclasse (extende de outra classe), o construtor vai precisar executar o super(), e sempre que você quiser referenciar um método da classe-mãe, você pode acessar esses métodos via super. */ super(0, cliente, agencia); ContaCorrente.numeroDeContas += 1; }

//Sobreescrevendo o comportamento de sacar
sacar(valor) {
    let taxa = 1.1;
    /* Eu estou um método privado "_sacar" na classe ContaCorrente porque ele estaria condição de apenas
    protegido, isto é, ele só pode ser usado por sua própria classe ou por alguma classe que esteja herdando
    este método */
    return this._sacar(valor, taxa);
}

}

A minha dúvida, se agora no método sacar(valor) da classe ContaCorrente.js está chamando apenas _sacar(valor,taxa) para que serve o método sacar(valor) da classe Conta.js?

1 resposta

Oi Ian, tudo bem?

Desculpe a demora em retornar.

Entendi a sua dúvida sobre o uso da classe sacar() na classe Conta. Na verdade, na classe ContaCorrente, estamos sobrescrevendo o método sacar() da classe Conta, para adicionar uma taxa de 10% sobre o valor sacado. Nesse caso, a implementação da função sacar() na classe Conta não é mais utilizada diretamente pela classe ContaCorrente.

Porém, a função sacar() na classe Conta ainda é importante, pois ela contém um método privado _sacar() que é usado tanto pela classe Conta quanto pela classe ContaCorrente. O método _sacar() é responsável por fazer a validação do saldo disponível na conta antes de permitir o saque e subtrair o valor sacado do saldo da conta.

Na classe ContaCorrente, o método _sacar() é invocado através do método sacar(), que adiciona a taxa de 10% sobre o valor sacado, como já mencionado. Portanto, a função sacar() na classe Conta não é mais utilizada diretamente, mas o método privado _sacar() ainda é importante e é utilizado por ambas as classes.

Para ilustrar melhor essa situação, podemos adicionar um console.log() no método _sacar() da classe Conta para verificarmos quando ele é chamado pela classe ContaCorrente:

_sacar(valor, taxa) {
    console.log("Método _sacar() da classe Conta sendo chamado");
    const valorSacado = taxa * valor;
    if(this._saldo >= valorSacado){
        this._saldo -= valorSacado;
        return valorSacado;
    }
    return 0;
}

Dessa forma, podemos ver que o método _sacar() da classe Conta é chamado quando a classe ContaCorrente invoca o método sacar(), que por sua vez chama o método _sacar() da classe Conta. O resultado disso é que a taxa de 10% é aplicada sobre o valor sacado e o saldo é atualizado corretamente.

Em resumo, o método sacar() da classe Conta não é mais utilizado diretamente pela classe ContaCorrente, mas o método privado _sacar() é compartilhado por ambas as classes e é fundamental para a validação do saldo e atualização do saldo após o saque.

Espero que tenha te ajudado.

Um abraço e bons estudos.