1
resposta

[JavaScript: programação Orientada a Objetos] [Módulo: 03 - Classes e Herança][Exemplos de Aula]

Oi pessoal, tudo bem?

Estou evoluindo com as aulas sobre classes e heranças e gostaria de entender uma situação aqui que está diferente dos exemplos de aula.

Repliquei os modelos das classes vistos em aula com os mesmos contrutores e métodos. No entanto, quando eu chamo as classes "Admin" e "Docente" no teriminal, tendo como saída os métodos de aprovarEstudante na classe Docente:

class Docente extends User{
    constructor(nome, email, dtnascimento, role = 'Docente', ativo){
        super(nome, email, dtnascimento, role, ativo)
    }
    aprovarEstudante(nomeEstudante, statusAPRP){
        console.log(
            'Olá, ' +this.nome +"\n"
            +'Estudante: ' +nomeEstudante +"\n" 
            +'Status: ' +statusAPRP
        )

    }

}

const docenteSukys = new Docente('F. Sukys', 'sukys@sukys', '04/02/1649');
console.log(docenteSukys);
//console.log(docenteSukys.exibinfos());
console.log(docenteSukys.aprovarEstudante("Eleutério", 'Reprovado'))

E criarCurso na classe **Admin: **

import User from "./User.js";

class Admin extends User{
    constructor(nome, email, dtnascimento, role = 'Admin', ativo){
        super(nome, email, dtnascimento, role, ativo)

    }

    criarCurso(novoCurso, qtdVagas){
        console.log('Olá, ' +this.nome +'\n' +'Curso Criado com Sucesso' +'\n'
            +'Nome do Curso: ' +novoCurso +'\n'
            +'Quantidade de Vagas Completadas: ' +qtdVagas
        )


    }
}

const adminZeca = new Admin('Zeca', 'zeca@zeca', '20/09/1988')

console.log(adminZeca.criarCurso('Controle no domínio do espaço relativista', '15'))
console.log(adminZeca.exibirInfos())

Em ambos os casos o terminal exibe o conteúdo de exibirInfos que está na classe **User: **

    `export default class User {
    constructor(nome, email, dtnascimento, role = 'User', ativo = true) {
        this.nome = nome;
        this.email = email;
        this.dtnascimento = dtnascimento;
        this.role = role || 'estudante';
        this.ativo = ativo || 'false';
 

    }
    exibirInfos(){
        let mensagemAtivo = 'Não'
        let saudacaoMsg = '*** Atenção! Erro ao criar usuário, por favor, procure a Administração do seu curso ***'
        if(this.ativo === true){
            mensagemAtivo = 'Sim';
            saudacaoMsg = '*** Usuário Criado com Sucesso! ***'


        }
        console.log('Olá, ' +this.nome +'\n' +"email: " +this.email +'\n' +'Data de Nascimento: ' +this.dtnascimento +  '\n' +'Usuário está ativo: ' +mensagemAtivo +'\n' +'Permissão de usuário: ' +this.role +'\n' +saudacaoMsg)

    }

}

const userRafa = new User('Rafael', 'rafael@rafael.com', '19/07/1984');
//console.log(userRafa);
console.log(userRafa.exibirInfos())
//console.log(User.prototype.isPrototypeOf(userRafa))`

Abaixo o resultado do terminal quando eu invoco a classe Admin, veja que é apresentado o resultado completo do exibirInfos() da classe User que não foi instanciada.

Olá, Rafael
email: rafael@rafael.com
Data de Nascimento: 19/07/1984
Usuário está ativo: Sim
Permissão de usuário: User
*** Usuário Criado com Sucesso! ***
undefined
Docente {
  nome: 'F. Sukys',
  email: 'sukys@sukys',
  dtnascimento: '04/02/1649',
  role: 'Docente',
  ativo: true
}
Olá, F. Sukys
Estudante: Eleutério
Status: Reprovado
undefined

Nos métodos apliquei algumas lógicas para poder treinar um pouco, mas nada que impactasse a estrutura das classes que foram propostas na aula. De qualquer forma fiquei intrigado e gostaria de saber como faço para ter os resultados somente das classes que foram instanciadas no noterminal.

Obrigado desde já! Abraço!

1 resposta

Oi Rafael, tudo bem?

Vamos dar uma olhada em alguns pontos que podem estar causando confusão:

  1. Métodos com console.log: Quando você chama console.log(docenteSukys.aprovarEstudante("Eleutério", 'Reprovado')), o método aprovarEstudante já está imprimindo a saída no console, e a função console.log externa está tentando imprimir o retorno do método, que é undefined (já que o método não retorna nada explicitamente). O mesmo ocorre com adminZeca.criarCurso('Controle no domínio do espaço relativista', '15').

  2. Retorno dos Métodos: Se você deseja que os métodos apenas retornem uma string sem imprimir diretamente no console, você pode modificar os métodos aprovarEstudante e criarCurso para retornar a mensagem em vez de usar console.log dentro deles. Assim, você pode controlar quando e onde a mensagem será exibida. Por exemplo:

    aprovarEstudante(nomeEstudante, statusAPRP) {
        return (
            'Olá, ' + this.nome + "\n" +
            'Estudante: ' + nomeEstudante + "\n" +
            'Status: ' + statusAPRP
        );
    }
    

    E então, ao chamar o método, você faz:

    console.log(docenteSukys.aprovarEstudante("Eleutério", 'Reprovado'));
    
  3. Chamada de exibirInfos: Certifique-se de que você está chamando exibirInfos apenas quando necessário. No seu exemplo, você está chamando console.log(adminZeca.exibirInfos()), o que imprime as informações do usuário. Se você deseja evitar que isso aconteça, simplesmente remova ou comente essa linha.

  4. Verificação de Instâncias: As informações de User estão sendo exibidas porque você está chamando exibirInfos em instâncias que herdam de User. Se você não deseja ver essas informações, não chame exibirInfos ou modifique o método para retornar apenas as informações desejadas.

Espero que essas dicas ajudem a ajustar o comportamento do seu código conforme esperado.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.