- Fundamentos de la programación orientada a objetos: Abstracción
- Fundamentos de la programación orientada a objetos: Encapsulación
- Fundamentos de la programación orientada a objetos: Herencia
- Fundamentos de la programación orientada a objetos: Polimorfismo
- Fundamentos de la programación orientada a objetos: Composición (diseño)
- Definición de clases
- Derechos de acceso
- Constructores: por defecto, paramétricos y de copia
- Destructores
- Autorreferencia: esto
- Herencia
- Creación dinámica de objetos: nuevo y suprimir
- Punteros
- Métodos virtuales (virtual y override)
- Miembros estáticos
- Tipos anidados, espacios de nombres y operador de contexto '::'
- Dividir definición y declaración de clase
- Clases abstractas e interfaces
- Sobrecarga de operadores
- Conversión de tipos de objeto: dynamic_cast y puntero void *
- Punteros, referencias y const
- Gestión de la herencia: final y delete
Derechos de acceso
Se proporciona una sintaxis especial para editar el acceso a los miembros de la clase (ya la vimos en el capítulo sobre estructuras). En cualquier parte del bloque, antes de la descripción de los miembros de la clase, puede insertar un modificador: una de las tres palabras clave (private, protected, public) y un signo de dos puntos.
Todos los miembros que sigan al modificador, hasta que se encuentre otro modificador, o hasta el final de la clase, recibirán la restricción de visibilidad correspondiente.
Por ejemplo, la siguiente entrada es idéntica a la descripción anterior de la clase Shape, ya que se asume el modo private para las clases sin modificadores:
class Shape
|
Si quisiéramos abrir el acceso a todos los campos, cambiaríamos el modificador a public
class Shape
|
Pero eso infringiría el principio de encapsulación, y no lo vamos a hacer. En lugar de ello, insertamos el modificador protected: permite acceder a los miembros de las clases derivadas dejándolos ocultos al mundo exterior. Estamos planeando extender la clase Shape a varias otras clases de forma que necesitarán acceso a las variables del padre.
class Shape
|
Por el camino, hemos hecho públicas ambas funciones.
Los modificadores pueden intercalarse en la descripción de la clase de forma arbitraria y repetirse muchas veces. Sin embargo, para mejorar la legibilidad del código, se recomienda hacer una sección de miembros public, protected y private , y mantener el mismo orden en todas las clases del proyecto.
Observe que hemos añadido la palabra clave const al final del encabezado de la función toString, lo que significa que la función no cambia el estado de los campos del objeto. Aunque no es necesario, ello ayuda a prevenir la corrupción accidental de variables y también permite a los usuarios de la clase y al compilador saber que la llamada a la función no dará lugar a ningún efecto secundario.
En la función toString, como en cualquier método de clase, los campos son accesibles por sus nombres. Más adelante veremos cómo declarar métodos como estáticos: están totalmente relacionados con la clase, no con las instancias del objeto, y por lo tanto no se puede acceder a los campos.
Ahora podemos llamar al método toString desde la variable de objeto s:
void OnStart()
|
Aquí vemos el uso del carácter de punto '.' como operador de desreferenciación especial: proporciona acceso a los miembros del objeto, es decir, campos y métodos. A la izquierda debe haber un objeto, y a la derecha, el identificador de una de las propiedades disponibles.
El método toString es público, y por tanto accesible desde una función externa a la clase OnStart. Si intentáramos en OnStart «llegar» a los campos s.x o s.y mediante dereferenciación, obtendríamos un error de compilación «no se puede acceder al miembro protegido declarado en 'Shape'».
Para los profesionales de C++, señalamos que MQL5 no admite los llamados «amigos» (para el resto, expliquemos que en C++ es posible, si es necesario, hacer una especie de «lista blanca» de clases y métodos de terceros que tienen derechos extendidos, aunque no son «parientes»).
Cuando ejecutemos el programa, veremos que da un par de números. No obstante, los valores de las coordenadas serán aleatorios. Incluso si tiene la suerte de ver nulos, ello no garantiza que aparezcan la siguiente vez que ejecute el script. Por regla general, si la lista de programas MQL en ejecución no cambia en el terminal, los lanzamientos repetidos de cualquier script resultan en la asignación de la misma área de memoria al mismo, lo que puede dar la impresión engañosa de que el estado del objeto es estable. De hecho, los campos de un objeto, como en el caso de las variables locales, no se inicializan con nada por defecto (véase la sección Inicialización).
Para inicializarlos se utilizan funciones especiales de la clase: los constructores.