Programación D: modificadores de acceso a clases

La ocultación de datos es una de las características importantes de la Programación Orientada a Objetos que permite evitar que las funciones de un programa accedan directamente a la representación interna de un tipo de clase. La restricción de acceso a los miembros de la clase está especificada por la etiquetapublic, privatey protectedsecciones dentro del cuerpo de la clase. Las palabras clave público, privado y protegido se denominan especificadores de acceso.

Una clase puede tener varias secciones etiquetadas públicas, protegidas o privadas. Cada sección permanece en efecto hasta que se ve otra etiqueta de sección o la llave de cierre derecha del cuerpo de la clase. El acceso predeterminado para miembros y clases es privado.

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

Los miembros públicos en D

UN publicmiembro es accesible desde cualquier lugar fuera de la clase pero dentro de un programa. Puede establecer y obtener el valor de las variables públicas sin ninguna función miembro, como se muestra en el siguiente ejemplo:

Ejemplo

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); 
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Length of line : 6 
Length of line : 10

Los miembros privados

UN privateNo se puede acceder a la variable miembro o función, ni siquiera se puede ver desde fuera de la clase. Solo las funciones de clase y amigo pueden acceder a miembros privados.

Por defecto, todos los miembros de una clase son privados. Por ejemplo en la siguiente clasewidth es un miembro privado, lo que significa que hasta que etiquetes un miembro explícitamente, se asume como un miembro privado -

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

Prácticamente, necesita definir datos en la sección privada y funciones relacionadas en la sección pública para que se puedan llamar desde fuera de la clase como se muestra en el siguiente programa.

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()); 
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Length of box : 10 
Width of box : 10

Los miembros protegidos

UN protected La variable o función miembro es muy similar a un miembro privado, pero proporcionó un beneficio adicional de que se puede acceder a ellas en clases secundarias que se denominan clases derivadas.

Aprenderá las clases derivadas y la herencia en el próximo capítulo. Por ahora puede consultar el siguiente ejemplo donde una clase secundariaSmallBox se deriva de una clase padre Box.

El siguiente ejemplo es similar al ejemplo anterior y aquí width miembro es accesible por cualquier función miembro de su clase 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()); 
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Width of box : 5