Considere um exemplo de herança entre duas classes: a base classe Veiculo e a classe derivada Carro:
class Veiculo {
constructor() {
}
}
class Carro extends Veiculo {
constructor() {
super();
}
}
Os construtores foram definidos em branco para focarmos no assunto de construtores protegidos.
Considere as seguintes expressoes:
let umVeiculo: Veiculo;
umVeiculo = new Carro();
A variável umVeiculo é declarada com tipo Veiculo. Podemos atribuir um objeto do tipo Carro à essa variàvel porque um Carro é um Veiculo.
Agora vamos ver outra expressão:
let veiculo: Veiculo = new Veiculo();
Nesse caso criamos um objeto usando a base classe Veiculo. Mas há situações em que não queremos permitir a instanciação de objetos do tipo da base classe. Isto é, só queremos permitir a construção de instância de objetos cuja classe é Carro, Moto, etc.
A maneira de resolver o problema é através da palavra chave protected. Basta adicionar à esquerda da assinatura do constructor da base classe:
class Veiculo {
protected constructor() {
}
}
Agora, a seguinte expressão irá causar um erro:
let veiculo: Veiculo = new Veiculo();
Constructor of class 'Veiculo' is protected
and only accessible within the class declaration.
Com a adição de protected antes da assinatura do constructor(), não é mais possível criar objetos baseados diretamente na base classe Veiculo. Em vez disso, o usuário tem criar objetos a partir de classes derivadas de Veiculo. No caso acima, temos que usar new Carro().
Para aprender mais sobre o TypeScript, assista às aulas do NBK Mundo Tech:
https://www.youtube.com/watch?v=jOJYBcjJ0CE&list=PLUbb2i4BuuzBcH1iS242xjztUwMI4erNb
Nos vemos lá!