Não existe uma sintaxe nativa para criar classes abstratas, como em outras linguagens de programação orientada a objetos. No entanto, é possível simular o comportamento de uma classe abstrata definindo uma classe base com métodos abstratos que devem ser implementados pelas classes derivadas. Um método abstrato é um método que é declarado na classe base, mas não é implementado. Em vez disso, cada classe derivada deve implementar esse método de acordo com suas próprias necessidades. Se uma classe derivada não implementar um método abstrato, um erro será gerado em tempo de execução.
Fiz um exemplo de como criar uma classe abstrata em JavaScript usando esse conceito:
class Animal { constructor() { if (new.target === Animal) { throw new TypeError("Não é possível instanciar classe abstrata "); } }
fala() { throw new Error("O método 'fala()' deve ser implementado."); } }
class Cachorro extends Animal { fala() { return "Auau!"; } }
class Gatos extends Animal { fala() { return "Miau!"; } }
const cachorro = new Cachorro(); console.log(cachorro.fala());
const gato = new Gato(); console.log(gato.fala());
const animal = new Animal();
A classe Animal é definida como abstrata, verificando se a classe new.target é a própria classe Animal. Se for, um erro é lançado, impedindo que essa classe seja instanciada diretamente. Além disso, a classe Animal possui um método abstrato fala(), que deve ser implementado por cada classe derivada. As classes Cachorro e Gato implementam esse método e retornam diferentes strings de acordo com o tipo de animal.
Por fim, uma tentativa de criar uma instância da classe Animal diretamente resultará em um erro, enquanto a criação de instâncias das classes derivadas Cachorro e Gato funciona como esperado.
Eu acho que é isso. Ou estou errado?