27 Clases I: Definiciones
Aunque te parezca mentira, hasta ahora no hemos visto casi nada de C++ que le sea exclusivo a este lenguaje. La mayor parte de lo incluido hasta el momento también forma parte de C.
Ahora vamos a entrar a fondo en lo que constituye el mayor añadido de C++ a C: las clases, y por tanto, la programación orientada a objetos. Así que prepárate para cambiar la mentalidad, y el enfoque de la programación tal como lo hemos visto hasta ahora.
En éste y en los próximos capítulos iremos introduciendo nuevos conceptos que normalmente se asocian a la programación orientada a objetos, como son: objeto, mensaje, método, clase, herencia, interfaz, etc.
Definiciones
Lo mejor es definir algunos conceptos clave en la programación orientada a objetos, más que nada para que todos sepamos de qué estamos hablando.
POO
Siglas de "Programación Orientada a Objetos". En inglés se escribe al revés "OOP". La idea básica de este paradigma de programación es agrupar los datos y los procedimientos para manejarlos en una única entidad: el objeto. Cada programa es un objeto, que a su vez está formado de objetos que se relacionan entre ellos.
Esto no significa que la idea de la programación estructurada haya desaparecido, de hecho se refuerza y resulta más evidente, como comprobarás cuando veamos conceptos como la herencia.
Nota:
Un paradigma es un modelo de trabajo o patrón compartido por una comunidad científica cuyos miembros están de acuerdo en qué es un problema legítimo y cuál es una solución legítima del problema, por lo que se comparten conceptos básicos, procedimientos, etc.
Objeto
Un objeto es una unidad que engloba en sí mismo datos y procedimientos necesarios para el tratamiento de esos datos.
Hasta ahora habíamos hecho programas en los que los datos y las funciones estaban perfectamente separadas, cuando se programa con objetos esto no es así, cada objeto contiene datos y funciones. Y un programa se construye como un conjunto de objetos, o incluso como un único objeto.
Mensaje
El mensaje es el modo en que se comunican e interrelacionan los objetos entre si.
En C++, un mensaje no es más que una llamada a una función de un determinado objeto. Cuando llamemos a una función de un objeto, muy a menudo diremos que estamos enviando un mensaje a ese objeto.
En este sentido, mensaje es el término adecuado cuando hablamos de programación orientada a objetos en general.
Método
Se trata de otro concepto de POO, los mensajes que lleguen a un objeto se procesarán ejecutando un determinado método de ese objeto.
En C++ un método no es otra cosa que una función o procedimiento perteneciente a un objeto.
Clase
Una clase se puede considerar como un patrón para construir objetos.
En C++, un objeto es sólo una instancia (un ejemplar) de una clase determinada. Es importante distinguir entre objetos y clases, la clase es simplemente una declaración, no tiene asociado ningún objeto, de modo que no puede recibir mensajes ni procesarlos, esto únicamente lo hacen los objetos.
Interfaz
Se trata de la parte del objeto que es visible para el resto de los objetos. Es decir, que es el conjunto de métodos (y a veces datos) de que dispone un objeto para comunicarse con él.
Las clases y por lo tanto también los objetos definidos a partir de ellas, tienen partes públicas y partes privadas. Generalmente, llamaremos a la parte pública de una clase u objeto su interfaz.
Herencia
Es la capacidad de crear nuevas clases basándose en clases previamente definidas, de las que se aprovechan ciertos datos y métodos, se desechan otros y se añaden nuevos.
Veremos que es posible diseñar nuevas clases basándose en clases ya existentes. En C++ esto se llama derivación de clases, y en POO herencia. Cuando se deriva una clase de otras, normalmente se añadirán nuevos métodos y datos. Es posible que algunos de estos métodos o datos de la clase original no sean válidos, en ese caso pueden ser enmascarados en la nueva clase o simplemente eliminados. El conjunto de datos y métodos que sobreviven, es lo que se conoce como herencia.
Jerarquía
Definición del orden de subordinación de un sistema clases.
En POO la herencia siempre se produce en un mismo sentido: se toman una o varias clases base y se crean clases nuevas que heredan parte de las características de las clases de las que procede.
Este procedimiento crea estructuras de clases en forma de árbol, en las que siempre es posible retroceder hasta una o varias clases base.
Veremos que la jerarquía es importante cuando hablemos de conceptos como polimorfismo.
Polimorfismo
La definición del diccionario es: "Cualidad de lo que tiene o puede tener distintas formas".
Esto ya nos da alguna pista. En POO este concepto es similar:
Propiedad según la cual un mismo objeto puede considerarse como perteneciente a distintas clases.
Esta propiedad se presenta sólo en objetos declarados a partir de una clase derivada. Nos permite tratar el mismo objeto como si hubiese sido declarado a partir de alguna de las clases base.
Es un concepto avanzado, y lo veremos con mayor detalle y claridad en el capítulo 37.
La idea básica es bastante simple. Por ejemplo, en una jerarquía como: "ser vivo", "vertebrado", "mamífero", "felino", "gato común"; un "objeto" creado de la clase "gato común" podría tratarse, según nos convenga, como un "vertebrado", un "felino", o como un objeto de cualquier clase de la jerarquía.
Si en la misma jerarquía derivamos de la clase "felino" otras clases como "tigre", "león" y "pantera", en determinadas circunstancias podríamos considerar de la misma clase objetos de las clases "gato doméstico", "tigre", "león", o "pantera". Podríamos, por ejemplo, almacenarlos todos en un array de "felinos".