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?