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