Implementación de herencia (C++).

   El Ejemplo Herencia muestra la implementación en C++ de las clases "persona" y "cientifico" mostradas en el diagrama de clases UML de la entrada POO (herencia/generalización); los detalles de dichas clases han sido explicados ahí, por lo que es importante que el lector los revise y analice antes de continuar, con la finalidad de contrastar el modelo con el código.

   El objetivo principal aquí es mostrar cómo un diseño de clases (UML) es implementado en un lenguaje de programación específico (C++). Para empezar, observe el lector que la herencia es implementada en la línea 43 por medio de:
class cientifico : public persona
dicha sentencia puede interpretarse como "la clase "cientifico" hereda todos los elementos públicos de persona". La estructura general para establecer herencia en C++ es:

    class clase-derivada : acceso clase-base {
              // cuerpo de la clase
      };


   Una clase derivada tiene acceso directo tanto a sus propios elementos miembro, como a los elementos miembro de la clase base.

   Es importante que el lector note la definición de los constructores para la clase "cientifico" (líneas 114-122), particularmente las líneas 115 y 120, en donde se puede notar la invocación del constructor correspondiente en la clase base (persona), y la inicialización del atributo local a la clase derivada (especialidad).

   Al igual que antes, se deja como ejercicio de análisis para el lector tanto los detalles restantes de implementación de la clase "científico", como el asegurarse de comprender la relación del diagrama UML con el código del Ejemplo Herencia.

   En este punto es importante también que el lector ponga especial atención en los métodos "mensaje" de las clases "persona" (líneas 105-107), y "cientifico" (líneas 132-134), ya que serán fundamentales para comprender la sobre escritura (override) de métodos.

   La ejecución del programa se lleva a cabo en la función main y se describe a continuación. La línea 148 define al objeto "p" y genera una instancia de la clase "persona" con características específicas; note que el constructor que está siendo utilizado es el definido en las líneas 74-79 del Ejemplo Herencia.

   Observe cómo en las líneas 151, 153, 155, 157 y 159 se envían mensajes específicos al objeto "p" para, respectivamente:
  •     Obtener su nombre.
  •     Cambiarle el nombre.
  •     Volver a obtener su nombre.
  •     Solicitarle comer.
  •     Solicitarle un mensaje.
   La salida de lo anterior se ve expresada en las primeras cuatro líneas de la salida correspondiente:
Nombre: Ricardo
Nombre: Ricardo Ruiz Rodriguez
Mmmmmm uno de los placeres de la vida...
Puedo hablar, mi nombre es Ricardo Ruiz Rodriguez

Nombre: Carl Sagan
Nombre: Carl Edward Sagan
Mmmmmm uno de los placeres de la vida...
Yo, Carl Edward Sagan, soy Astronomo y Astrofisico
La distancia del sol a la tierra es 149 600 000 kms
   Por otro lado, la línea 164 define y crea el objeto "c" como una instancia de la clase "cientifico". Al igual que antes, note cómo el constructor utilizado es el definido en las líneas 119-122.

   A su vez, las líneas 167 y 169 realizan algo análogo a lo que se hizo con el objeto "p", es decir, envían mensajes al objeto "c" para obtener y cambiar el nombre del científico.

   La línea 171 por su parte, cambia la especialidad del científico a través de un mensaje de tipo set.

   Finalmente, las líneas 173, 175, 177 y 179 envían mensajes específicos al objeto "c" para, respectivamente:
  •     Obtener su nombre.
  •     Solicitarle comer.
  •     Solicitarle un mensaje.
  •     Solicitarle un mensaje especial.
   Note cómo para el mensaje "mensaje" las respuestas del objeto "p" y del objeto "c" difieren por completo, debido a que aunque el mensaje es el mismo, el objeto que los recibe es distinto y por lo tanto responden de manera distinta a dicho mensaje; esto último fue lo que en su momento se definió como polimorfismo. En este ejemplo el polimorfismo está expresado en su forma de sobre escritura (override) de métodos.
 
    Finalmente, se muestra el mismo ejemplo anteriormente descrito utilizando espacios de nombres y separando el programa en distintos archivos. Este ejemplo corresponde más al estilo de C++ para programas grandes, en donde se establecen módulos de código separados para facilitar el mantenimiento de los programas, dotarlos de una versatilidad más conveniente al desarrollo, y separar las entidades lógicas y funcionales que lo componen. Para detalles acerca introductorios respecto a los espacios de nombres y su uso, se recomienda revisar la sección correspondiente hacia el final de la página Ejemplos selectos de transición.

No hay comentarios.:

Publicar un comentario