O Construtor Protegido no TypeScript

in #typescript5 years ago

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:

Nos vemos lá!