1
resposta

Duvida sobre a classe abstrata

Fala pessoal. Estava tentando usar o throw Error para proteger o cliente, e acabei percebendo uma coisa:

//Classe abstrata: É uma classe que não deve ser instaciada diretamente, sua função é apenas criar classes que herdem seu funcionamento.
import {Cliente} from "./Cliente.js"
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) {
        //Como essa classe foi criada apenas para que sejam herdados seus atributos, não deve ser instanciada sozinha. Então, devemos bloquear isto usando o constructor
        if (this.constructor == Conta) {
            throw new Error(`Você não deve criar objetos instanciados a esse tipo de classe diretamente`);
        } //Lançado erro para evitar que seja criado um objeto nesta classe
        this._saldo = saldoInicial;
        this._cliente = cliente;
        this._agencia = agencia;
    }
    //Protegendo o _cliente
    set cliente(novoValor) {
        if (novoValor instanceof Cliente) {
            this._cliente = novoValor;
        } else {
            throw new Error(`Você deve entrar com um cliente válido`)
        }
    }
    get cliente() {
        return this._cliente;
    }
    //Protegendo o _saldo
    get saldo() {
        return this._saldo;
    }
    sacar(valor) {
        let taxa = 1;
        return this._sacar(valor, taxa);
    }
    _sacar(valor, taxa) {
        let valorSacado = valor * taxa;
        if (this._saldo >= valorSacado) {
            this._saldo -= valorSacado;
            console.log(`Valor sacado foi R$ ${valor}. Saldo restante:R$ ${this._saldo}.`);
            if (taxa > 1) console.log(`A taxa para esta transação foi de R$ ${(valorSacado - valor).toFixed(2)}`)
            return valorSacado;
        } else {
            console.log(`Saldo insuficiente para o saque.`);
            return 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));
    }
}

Quando a classe abstrata está assim, não importa o cliente que eu entre, ele apenas aceita de qualquer jeito. Mesmo que seja uma string direto, ele aceita. Então corrigi assim:

//Classe abstrata: É uma classe que não deve ser instaciada diretamente, sua função é apenas criar classes que herdem seu funcionamento.
import {Cliente} from "./Cliente"
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) {
        //Como essa classe foi criada apenas para que sejam herdados seus atributos, não deve ser instanciada sozinha. Então, devemos bloquear isto usando o constructor
        if (this.constructor == Conta) {
            throw new Error(`Você não deve criar objetos instanciados a esse tipo de classe diretamente`);
        } //Lançado erro para evitar que seja criado um objeto nesta classe
        this._saldo = saldoInicial;
        this.cliente = cliente;
        this._agencia = agencia;
    }
    //Protegendo o _cliente
    set cliente(novoValor) {
        if (novoValor instanceof Cliente) {
            this._cliente = novoValor;
        } else {
            throw new Error(`Você deve entrar com um cliente válido`)
        }
    }
    get cliente() {
        return this._cliente;
    }
    //Protegendo o _saldo
    get saldo() {
        return this._saldo;
    }
    sacar(valor) {
        let taxa = 1;
        return this._sacar(valor, taxa);
    }
    _sacar(valor, taxa) {
        let valorSacado = valor * taxa;
        if (this._saldo >= valorSacado) {
            this._saldo -= valorSacado;
            console.log(`Valor sacado foi R$ ${valor}. Saldo restante:R$ ${this._saldo}.`);
            if (taxa > 1) console.log(`A taxa para esta transação foi de R$ ${(valorSacado - valor).toFixed(2)}`)
            return valorSacado;
        } else {
            console.log(`Saldo insuficiente para o saque.`);
            return 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));
    }
}

Assim funcionou conforme o esperado (usei o set na método constructor). Mas a dúvida é: Podemos usar os getters e ou setteres dentro do construtor da própria classe?

1 resposta

Fala José, tudo bem? Espero que sim!

Não seria correto e nem possivel utilizar getters ou setters dentro do objeto do construtor, ja que não é permitido a criação de métodos. O que você pode fazer é justamente o que você fez, criando esses métodos fora do construtor.

Espero ter ajudado, abraços e bons estudos :D