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

Dúvida - Herança e compartilhamento de código

Criei um projeto paralelamente ao da aula para exercitar um pouco, aí nessa de separar as classes, usar o extends, uma função minha (Material / calculaPreco) não executou do jeito que eu gostaria, vou colar o código aqui e se alguém puder ajudar, agradeço.

import { Fornecedor } from './Fornecedor.js';
import { Material } from './Material.js';
import { Papel } from './Papel.js';

const chamex = new Fornecedor('Chamex', '5.114.255/0001-02')

const papelKraft = new Papel('Kraft', 180, 25, chamex, 15);

console.log(papelKraft);

papelKraft.calculaPreco(6);
console.log(Material.precoFinal);

console.log(Material.qtdMateriais);
import { Fornecedor } from "./Fornecedor.js";

export class Material {
    static qtdMateriais = 0;
    static precoFinal = 0;
    constructor(tipo, gramatura, quantidade, fornecedor, preco){
        this._tipo = tipo;
        this._gramatura = gramatura;
        this._quantidade = quantidade;
        this._fornecedor = fornecedor;
        this._preco = preco;
        Material.qtdMateriais += 1;
    }

    set fornecedor(novoFornecedor){
        if(novoFornecedor instanceof Fornecedor){
            this._fornecedor = novoFornecedor;
        }
    }

    get fornecedor(){
        return this._fornecedor;
    }

    calculaPreco(area){
        if(this.quantidade > area) {
        this.precoFinal += area * this.preco;
        this.quantidade -= area;
        return this.precoFinal;
        }
    }
}
import { Material } from "./Material.js";

export class Papel extends Material {
    constructor(tipo, gramatura, quantidade, fornecedor, preco){
        super(tipo, gramatura, quantidade, fornecedor, preco);
    }
}
export class Fornecedor{

    constructor(nome, cnpj){
    this._nome = nome;
    this._cnpj = cnpj;
    }

    set nome(nomeCliente){
        this.nome = nomeCliente; 
    }

    get nome(){
        return this.nome
    }

    get cnpj(){
        return this._cnpj;
    }
}

Obs.: Qualquer sugestão para o código, mesmo que fora do problema que mostrei, será bem vinda também.

2 respostas
solução!

há alguns problemas dentro da sua função calculaPreco

    calculaPreco(area){
        if(this.quantidade > area) {
        this.precoFinal += area * this.preco;
        this.quantidade -= area;
        return this.precoFinal;
    }
  1. this.quantidade e this.preco não existem, vc informou no construtor como this.quantidade e this.preco. Para resolver isso é possivel: Criar um getter para cada atributo ou ajustar para this.quantidade e this.preco dentro do seu if,

     calculaPreco(area){
         if(this._quantidade > area) {
             this.precoFinal += area * this._preco;
             this._quantidade -= area;
             return this.precoFinal;
         }
     }

    Dica, sempre coloca alguns console.log mostrando quais os valores dentro, ou o todo do que está sendo feito.

  2. Outro ponto é quanto aos atributos estáticos da classe, se voce der um log no seu this.precoFinal verá que ele é indefinido. Isso ocorre pq ao chamar ao definir ele como estático não está fazendo parte da sua variavel papelKraft, mesmo que ela tenha acesso, mas fará parte da sua classe Material.

para os seus 2 finais consoles.logs exibirem o que eu acho q vc quer, vc deveria chamar dentro do if direto a classe Material em vez de this, deste modo:

    calculaPreco(area){
        console.log(this._quantidade)
        if(this._quantidade > area) {
            Material.precoFinal += area * this._preco
            Material.qtdMateriais -= area; 
                //eu acho q aqui vc quis dizer qtdMateriais em vez de quantidade?
                //se nao for é só colocar
                //this.quantidade mesmo
        return this.precoFinal;
        }
    }

Acho q é isso, me avisa qualquer coisa.

Espero ter ajudado

Ajudou bastante! Obrigado pelas dicas e por solucionar minha dúvida, consegui fazer funcionar do jeito que eu queria. :D