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

in typescript •  5 years ago 

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á!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Congratulations @nbkmundotech! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!