Classe abstrata simulada
Em JavaScript, não existe classes abstratas nativas. Mas em projetos reais, você precisa garantir que toda subclasse implemente um método específico. Por exemplo, uma loja virtual que calcula frete de formas diferentes — se um novo tipo de entrega for criado e o desenvolvedor esquecer de implementar calcularFrete(), o sistema quebra silenciosamente. Lançar um erro no método da classe base é a forma prática de detectar essa falha na hora, não em produção.
O PROBLEMA
Simule classe abstrata Funcionario que lança erro em calcularSalario(). Crie CLT e PJ que implementam.
EXEMPLO
new Funcionario("Ana").calcularSalario() → throw
new CLT("Ana",3000).calcularSalario() → 2670
new PJ("João",5000).calcularSalario() → 5000SOBRE O CONCEITO
A ideia é criar uma classe base Funcionario com um método calcularSalario() que, ao ser chamado, lança um erro com throw new Error('...'). Isso simula o comportamento de uma classe abstrata: a classe base não pode ser usada diretamente para calcular salário. As subclasses CLT e PJ devem sobrescrever (override) o método e implementar a lógica real. Erro comum: não lançar erro na classe base. Sem o throw, se alguém instanciar Funcionario e chamar calcularSalario(), o método não faz nada ou retorna undefined, o que pode passar despercebido. Outro erro: esquecer de implementar o método na subclasse — se a subclasse não sobrescrever, ela herda o método que lança erro, e o programa quebra quando tentar usar. O super e constructor são usados para passar parâmetros comuns (nome, salario base) para a classe pai.
RESOLUÇÃO