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

Duvida sobre função transferir

Fala pessoal, boa noite. Estou com uma dúvida sobre a aula 04 - Super e sobrescrita Pesquisando aqui, encontrei uma dúvida parecida com a minha, que está neste tópico: https://cursos.alura.com.br/forum/topico-sobrescricao-da-funcao-transferir-na-conta-150448#935078 A questão é, eu fiz de outra forma e gostaria de saber qual a melhor prática neste caso, seguir o que o amigo fez lá no outro fórum, ou isso que eu fiz. Segue o codigo: Classe Conta

export class Conta {
    //Como boa prática, devemos declarar e inicializar propriedades dentro de algum método da classe (o construtor é o mais comumente usado);
    constructor(saldoInicial, cliente, agencia) {
        this._saldo = saldoInicial;
        this._cliente = cliente;
        this._agencia = agencia;
    }
    //Protegendo o _cliente
    set cliente(novoValor) {
        if (novoValor instanceof Cliente) {
            this._cliente = novoValor;
        }
    }
    get cliente() {
        return this._cliente;
    }
    //Protegendo o _saldo
    get saldo() {
        return this._saldo;
    }
    sacar(valor) {
        let taxa = 1;
        let valorSacado = valor*taxa;
        if (this._saldo >= valorSacado) {
            this._saldo -= valorSacado;
            console.log(`Valor sacado foi R$ ${valorSacado}. Saldo restante:R$ ${this._saldo}`);
            return valorSacado;
        } else {
            console.log(`Saldo insuficiente para o saque.`);
            return valorSacado = 0;
        }
    }
    depositar(valor) {
        if (valor <= 0) {
            return
        }
        this._saldo += valor;
        console.log(`Seu novo saldo é R$${this._saldo}`)
    }
    transferir(valor, conta) {
        conta.depositar(this.sacar(valor));
    }
}

Para evitar o débito de taxa durante uma transferencia, fiz o seguinte: adicionei o método transferir na classe Conta Corrente, e utilizei o super para invocar o método da classe mãe (ou pai) sacar:


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

export class ContaCorrente extends Conta {
    //Atributos estáticos: São atributos da classe no geral, não das instancias
    static quantidadeContasCorrente = 0;
    constructor(cliente, agencia) {
        //Invocando o método super, que traz o construtor dessa classe pai, referenciando os atributos na classe filha
        super(0, cliente, agencia);
        //Incrementando a quantidade de contas correntes automaticamente. Como é um atributo da classe (tipo estático), ao invés de referencia-lo pelo this,
        //devemos chamar o nome da classe.atributo.
        ContaCorrente.quantidadeContasCorrente++;
    }
    sacar(valor) {
        let taxa = 1.1;
        let valorSacado = valor * taxa;
        if (this._saldo >= valorSacado) {
            this._saldo -= valorSacado;
            console.log(`Valor sacado foi R$ ${valor}. Saldo restante:R$ ${this._saldo}. Esta transação gerou R$${(valorSacado - valor).toFixed(2)} de taxas administrativas`);
            return valorSacado;
        } else {
            console.log(`Saldo insuficiente para o saque.`);
            return valorSacado = 0;
        }
    }
    transferir(valor, conta) { //transferencias sem taxas
        conta.depositar(super.sacar(valor));
    }

}

Também funcionou corretamente, mas qual a melhor prática?

2 respostas
solução!

Olá, José, tudo bem?

Nos desculpe a demora a responder.

Achei as duas soluções bem válidas. O único problema da sua é que, como você já deve ter visto que mais adiante no curso, o instrutor faz o método sacar() da classe mãe se tornar abstrato. Dessa forma, acaba não sendo possível chamá-lo nas classes filhas, que no caso da sua solução foi no método transferir().

Ou seja, o problema em si estava no fato do método sacar() da classe mãe ter uma taxa "padrão", isso em si não é uma boa prática se nós queremos que as classes filhas definam suas próprias taxas (ou seja, o ideal é tornar o método abstrato, como é feito em seguida).

Espero ter ajudado! Abraços e bons estudos :)

Muito obrigado Antonio. Realmente, mais pra frente eu vi a quesão da classe absrata.