Médio JavaScript
Herança com Funcionário e Gerente
Enunciado
Crie uma classe Funcionario com campos privados #nome e #salario, um construtor que os inicializa, um getter salario e um método aumentarSalario(percentual) que aumenta o salário em percentual%. Em seguida, crie a classe Gerente que estende Funcionario e adiciona um campo privado #departamento. O construtor de Gerente deve chamar super e inicializar #departamento. Adicione um getter departamento. Instancie um Gerente, aumente seu salário em 10% e exiba nome, salário e departamento.
Requisitos
Funcionariodeve ter campos privados#nomee#salario.Funcionariodeve ter gettersalarioe métodoaumentarSalario.Gerentedeve estenderFuncionarioe ter campo privado#departamento.- O construtor de
Gerentedeve usarsupere inicializar#departamento. Gerentedeve ter getterdepartamento.
Código inicial
class Funcionario {
// seu código aqui
}
class Gerente extends Funcionario {
// seu código aqui
}
const g = new Gerente('Carlos', 5000, 'Vendas');
g.aumentarSalario(10);
console.log(g.nome); // se tiver getter nome, senão adapte
console.log(g.salario);
console.log(g.departamento);
Saída esperada
Carlos
5500
Vendas
Ver dica
No construtor de Gerente, chame super(nome, salario) antes de usar this. Para o getter de nome, você pode adicionar um getter nome em Funcionario.
Mostrar solução
class Funcionario {
#nome;
#salario;
constructor(nome, salario) {
this.#nome = nome;
this.#salario = salario;
}
get nome() {
return this.#nome;
}
get salario() {
return this.#salario;
}
aumentarSalario(percentual) {
this.#salario += this.#salario * (percentual / 100);
}
}
class Gerente extends Funcionario {
#departamento;
constructor(nome, salario, departamento) {
super(nome, salario); // chama o construtor da classe pai
this.#departamento = departamento;
}
get departamento() {
return this.#departamento;
}
}
const g = new Gerente('Carlos', 5000, 'Vendas');
g.aumentarSalario(10);
console.log(g.nome);
console.log(g.salario);
console.log(g.departamento);
Passo a passo
- A classe
Funcionariodefine os campos privados#nomee#salario. - O construtor recebe
nomeesalarioe os atribui aos campos privados. - Criamos getters
nomeesalariopara permitir leitura externa. - O método
aumentarSalariocalcula o novo salário com base no percentual e atualiza#salario. - A classe
GerenteestendeFuncionariocomextends. - No construtor de
Gerente, chamamossuper(nome, salario)para inicializar a parte herdada, e depois atribuímos#departamento. - Adicionamos um getter
departamento. - Criamos uma instância
g, chamamosaumentarSalario(10)e imprimimos os valores.
Por que funciona
A herança permite que Gerente reutilize o código de Funcionario, incluindo o método aumentarSalario e os getters. O super é obrigatório antes de usar this no construtor da subclasse, pois inicializa a parte pai. Os campos privados garantem que #salario só possa ser alterado via método controlado.
Erros comuns
- Esquecer de chamar
superantes de usarthisno construtor deGerente: geraReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor. - Tentar acessar
g.#salariofora da classe: erro de sintaxe. - Não definir o getter
nomeemFuncionarioe tentar acessarg.nome: retornaundefined.
Outra forma de resolver
Se não precisar de encapsulamento, pode usar propriedades públicas e métodos tradicionais. Mas a versão com campos privados é mais segura.
Saída esperada
Carlos
5500
Vendas