Como Usar protected para Acessar Membros Privados de uma Base Classe no TypeScript

Em programação orientada à objetos, os atributos de um objeto são normalmente definidos com acesso privado para não serem lidos ou modificados diretamente. Em vez do acesso direto a propriedade, funções getter e setter são definidas para disponibilizar uma API de leitura e modificação, respectivamente.

Por exemplo, suponha que temos uma classe que representa um veículo:

class Veiculo {
  private marca: string;

  constructor(aMarca: string) {
    this.marca = aMarca;
  }

  obterMarca() {
    return this.marca;
  }

  modificarMarca(novaMarca: string) {
    this.marca = novaMarca;
  }
}

Podemos criar um veículo da seguinte maneira:

let carro = new Veiculo("Honda");

Mas o acesso e modificação da marca do veículo após sua construção não é permitida:

console.log(carro.marca);
carro.marca = "Toyota";

O compilador mostra o seguinte erro para ambas as expressões:

Property 'marca' is private and only accessible within class 'Veiculo'.

Vamos agora criar uma classe derivadas de um Veiculo: Carro. Veja o código abaixo:

class Carro extends Veiculo {
  imprimirMarca() {
    console.log(this.marca);
  }
}

A classe Carro herda o constructor da base classe Veiculo, então não precisamos defini-lo novamente.

O metodo imprimirMarca vai dar erro porque this.marca não é acessível da classe derivada, Carro. A marca é uma propriedade da base classe Veiculo, com acesso private:

Property 'marca' is private and only accessible within class 'Veiculo'.

Para podermos ter acesso direto de uma propriedade da base classe na classe derivada, precisamos usar o modo de acesso protected:

class Veiculo {
  protected marca: string;

  // ...
}

Agora, a chamada de imprimirMarca de um objeto da classe Carro irá funcionar sem problemas. O acesso à propriedade marca da superclasse Veiculo é permitido.

Para aprender mais sobre o TypeScript, assista às aulas do NBK Mundo Tech:

Nos vemos lá!

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now