Programação D - modificadores de acesso de classe

A ocultação de dados é uma das características importantes da Programação Orientada a Objetos que permite evitar que as funções de um programa acessem diretamente a representação interna de um tipo de classe. A restrição de acesso aos membros da classe é especificada pelo rotuladopublic, private, e protectedseções dentro do corpo da classe. As palavras-chave public, private e protected são chamadas de especificadores de acesso.

Uma classe pode ter várias seções rotuladas públicas, protegidas ou privadas. Cada seção permanece em vigor até que outro rótulo de seção ou a chave direita de fechamento do corpo da classe seja vista. O acesso padrão para membros e classes é privado.

class Base { 
  
   public: 
  
  // public members go here 
  
   protected: 
  
  // protected members go here 
  
   private: 
  
  // private members go here 
  
};

Os membros públicos em D

UMA publicmembro pode ser acessado de qualquer lugar fora da classe, mas dentro de um programa. Você pode definir e obter o valor de variáveis ​​públicas sem qualquer função de membro, conforme mostrado no exemplo a seguir -

Exemplo

import std.stdio;

class Line { 
   public:
      double length; 

      double getLength() { 
         return length ; 
      }
      
      void setLength( double len ) { 
         length = len; 
      } 
} 
 
void main( ) { 
   Line line = new Line();
   
   // set line length 
   line.setLength(6.0); 
   writeln("Length of line : ", line.getLength());  
   
   // set line length without member function 
   line.length = 10.0; // OK: because length is public 
   writeln("Length of line : ", line.length); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Length of line : 6 
Length of line : 10

Os membros privados

UMA privatea variável ou função de membro não pode ser acessada ou mesmo visualizada de fora da classe. Apenas as funções de classe e amigo podem acessar membros privados.

Por padrão, todos os membros de uma classe são particulares. Por exemplo, na seguinte aulawidth é um membro privado, o que significa que até você rotular um membro explicitamente, ele é considerado um membro privado -

class Box { 
   double width; 
   public: 
      double length; 
      void setWidth( double wid ); 
      double getWidth( void ); 
}

Na prática, você precisa definir os dados na seção privada e as funções relacionadas na seção pública para que possam ser chamados de fora da classe, conforme mostrado no programa a seguir.

import std.stdio;

class Box { 
   public: 
      double length; 

      // Member functions definitions
      double getWidth() { 
         return width ; 
      } 
      void setWidth( double wid ) { 
         width = wid; 
      }

   private: 
      double width; 
}
  
// Main function for the program 
void main( ) { 
   Box box = new Box();
   
   box.length = 10.0; 
   writeln("Length of box : ", box.length);
   
   box.setWidth(10.0);  
   writeln("Width of box : ", box.getWidth()); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Length of box : 10 
Width of box : 10

Os membros protegidos

UMA protected a variável de membro ou função é muito semelhante a um membro privado, mas forneceu um benefício adicional que eles podem ser acessados ​​em classes filhas que são chamadas de classes derivadas.

Você aprenderá classes derivadas e herança no próximo capítulo. Por agora você pode verificar o seguinte exemplo onde uma classe de criançaSmallBox é derivado de uma classe pai Box.

O exemplo a seguir é semelhante ao exemplo acima e aqui width membro é acessível por qualquer função de membro de sua classe derivada SmallBox.

import std.stdio;

class Box { 
   protected: 
      double width; 
} 
 
class SmallBox:Box  { // SmallBox is the derived class. 
   public: 
      double getSmallWidth() { 
         return width ; 
      }
	  
      void setSmallWidth( double wid ) {
         width = wid; 
      } 
} 
 
void main( ) { 
   SmallBox box = new SmallBox();  
   
   // set box width using member function 
   box.setSmallWidth(5.0); 
   writeln("Width of box : ", box.getSmallWidth()); 
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Width of box : 5