Академический Документы
Профессиональный Документы
Культура Документы
o Jerarqua de clases.
o Clases abstractas.
o Funciones virtuales.
o Overriding.
o Ejemplo.
o La clase CFigura.
o La clase CRectangulo.
o La clase CCirculo.
o Interfases.
Jerarqua de clases.
En el ejemplo del captulo 2 creamos una pequea jerarqua, (bastante pequea por
cierto), basada en 2 clases. Cuando el diseo de la jerarqua involucra ms clases la
dificultad se presenta a la hora de identificar las relaciones entre las clases que hacen
que se pueda formar una jerarqua.
Clases abstractas.
Existe una clase especial muy til para crear jerarquas, o mejor digamos que es muy
tpico usarla para disear jerarquas. Estas clases se llaman "clases abstractas", son
como cualquier otra, pero definidas con la intencin de que sirvan como clase base de
otras clases. O sea que nunca se va a crear una instancia de una clase abstracta, (nunca
se crear un objeto de esa clase).
Se podra decir que una clase abstracta presenta la interfase comn para los objetos de
clases derivadas.
Funciones virtuales, (overriding).
Tcnicamente una clase abstracta define por lo menos una funcin virtual, que es
aquella que puede ser rescrita en la clase derivada, (que hered esa funcin virtual). Una
funcin virtual en una clase es solamente la definicin del prototipo de la funcin
precedida por la palabra reservada virtual y no hay implementacin de la misma en esa
clase, sino que queda a criterio de clases derivadas, si es aplicable, la escritura de la
implementacin, (el desarrollo de la funcin). Esto es overriding.
Imaginemos que necesitamos escribir un programa para gestionar liquidaciones de
sueldos en una empresa grande y queremos aplicar nuestro conocimientos en POO.
Seguramente muy pronto identificaramos la posibilidad de disear una jerarqua de
clases como por ejemplo muestra la siguiente figura:
La clase CEmpleado definira todas las caractersticas comunes a todos los empleados,
por ejemplo datos miembros como m_Apellido, m_Nombre, m_Edad, m_Salario, y
mtodos como Despedir(), AumentarSalario(...), etc. Adems definira funciones
virtuales como AumentarComision(), (pensemos que slo algunos empleados cobran
comisiones, por ejemplo los gerentes).
Cuando se herede CGerente de CEmpleado, esta clase heredar todos los datos y
funciones miembros de CEmpleado pudiendo adems sobrescribir la funcin virtual
AumentarComision() y agregando, por ejemplo, datos miembros particulares de esta
clase como m_Secretaria, (supongamos nuevamente que slo el gerente tiene una
secretaria a su disposicin).
Un ejemplo prctico.
La clase CFigura.
Clase CFigura.
datos miembros:
int left; (x de la coordenada superior izquierda).
int top; (y de la coordenada superior izquierda).
int right; (x de la coordenada inferior derecha).
int bottom; (y de la coordenada inferior derecha).
RGB m_color; (variable de estructura tipo RGB para almacenar los valores
del color).
funciones miembros:
Constructor; (inicializara los datos miembros con 0).
Destructor; (nada en particular)
Mover; (recibira la nueva posicin del punto x,y superior izquierdo).
SetColor; (recibira una variable de tipo RGB que contiene los valores del
nuevo color).
GetColor; (recibira una referencia a RGB donde ubicara los valores del
color actual).
Hasta aqu las funciones que debera definir e implementar CFigura, pero adems podra
presentar como funciones virtuales, (o sea slo el prototipo y no el desarrollo), aquellas
que tambin son comunes a todas las figuras pero cuyo contenido vara, ejemplo
Dibujar(), entonces le agregaramos a CFigura:
virtual Dibujar;
virtual Permetro;
virtual Superficie;
Los datos miembro left, top, right, bottom son los puntos (x,y) de cada extremo del
rectngulo contenedor de una figura:
Ya tenemos una idea de nuestra clase CFigura, entonces vaya, en Visual C++, a File -
New y seleccione un proyecto Win32 Console Application, (en blanco).
Una vez creado el proyecto vaya a File - New y seleccione C++ Header File y como
nombre al archivo colquele CFigura, acepte y escriba:
//CFigura.h: Definicin de la clase CFigura.
La clase CRectangulo.
Al derivar CRectagulo de forma pblica de CFigura, heredar todos los datos miembros
y funciones miembros, (no virtuales), deberemos agregar como dato miembro exclusivo
del rectngulo la altura y la base y adems sobrescribir las funciones virtuales de
CFigura.
Vaya nuevamente a File - New, seleccione C++ Header File, colquele como nombre
CRectangulo, acepte y escriba:
~CRectangulo()
{
//por ahora nada en el constructor
}
//Funciones sobrescritas.
void Dibujar();
double Superficie();
double Perimetro();
};
double CRectangulo::Superficie()
{
double sup;
sup= (double)(base*altura)/2;
return sup;
}
double CRectangulo::Perimetro()
{
return (double)(base)*2 + (altura)*2;
}
La clase CCirculo.
double CCirculo::Superficie ()
{
double sup;
sup= (double) PI * pow(radio,2);
return sup;
}
double CCirculo::Perimetro ()
{
return (double) 2*PI * radio;
}
Para probar estas clase agregaremos una vez ms un archivo C++ Source File, (yo le
puse de nombre "ejemplo7", pero puede ser cualquiera).
All escriba:
//Ejemplo de Overriding.
//Autor: Demian Panello.
//Yerba Mate y Visual C++ -> www.dcp.com.ar
#include "iostream.h"
#include "CFigura.h"
#include "CRectangulo.h"
#include "CCirculo.h"
void main(void)
{
CRectangulo r(2,2, 6,8, 255,0,0);
CCirculo c(0,0,10,10, 0,0,255);
RGB fc;
Finalmente queda por decir que a aquellas clases abstractas compuestas slo de
funciones virtuales se las llama "Interfases" y son muy usadas en las programacin de
componentes COM. Por ejemplo tenemos la clase/interfase IUnknown. Pero esto ya es
otro tema.