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

  • Funcionario deve ter campos privados #nome e #salario.
  • Funcionario deve ter getter salario e método aumentarSalario.
  • Gerente deve estender Funcionario e ter campo privado #departamento.
  • O construtor de Gerente deve usar super e inicializar #departamento.
  • Gerente deve ter getter departamento.

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

  1. A classe Funcionario define os campos privados #nome e #salario.
  2. O construtor recebe nome e salario e os atribui aos campos privados.
  3. Criamos getters nome e salario para permitir leitura externa.
  4. O método aumentarSalario calcula o novo salário com base no percentual e atualiza #salario.
  5. A classe Gerente estende Funcionario com extends.
  6. No construtor de Gerente, chamamos super(nome, salario) para inicializar a parte herdada, e depois atribuímos #departamento.
  7. Adicionamos um getter departamento.
  8. Criamos uma instância g, chamamos aumentarSalario(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 super antes de usar this no construtor de Gerente: gera ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor.
  • Tentar acessar g.#salario fora da classe: erro de sintaxe.
  • Não definir o getter nome em Funcionario e tentar acessar g.nome: retorna undefined.

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