Você está na página 1de 4

POLIMORFISMO

En programacin orientada a objetos se denomina polimorfismo a la capacidad que tienen


los objetos de una clase de responder al mismo mensaje o evento en funcin de los
parmetros utilizados durante su invocacin. Un objeto polimrfico es una entidad que
puede contener valores de diferentes tipos durante la ejecucin del programa.
Dicho de otra forma, el polimorfismo consiste en conseguir que un objeto de una clase se
comporte como un objeto de cualquiera de sus subclases, dependiendo de la forma de
llamar a los mtodos de dicha clase o subclases. Una forma de conseguir objetos
polimrficos es mediante el uso de punteros a la superclase. De esta forma podemos tener
dentro de una misma estructura (arrays, listas, pilas, colas,...) objetos de distintas
subclases, haciendo que el tipo base de dichas estructuras sea un puntero a la superclase.
Otros lenguajes nos dan la posibilidad de crear objetos polimrficos con el operador new.
La forma de utilizarlo, por ejemplo en java, sera:

Superclase sup = new (Subclase);


En la prctica esto quiere decir que un puntero a un tipo puede contener varios tipos
diferentes, no solo el creado. De esta forma podemos tener un puntero a un objeto de la
clase Trabajador, pero este puntero puede estar apuntando a un objeto subclase de la
anterior como podra ser Mrketing, Ventas o Recepcionistas (todas ellas deberan ser
subclase de Trabajador).
El concepto de polimorfismo se puede aplicar tanto a funciones como a tipos de datos.
As nacen los conceptos de funciones polimrficas y tipos polimrficos. Las primeras son
aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de
forma indistinta; los tipos polimrficos, por su parte, son aquellos tipos de datos que
contienen al menos un elemento cuyo tipo no est especificado.

Clasificacin:
Se puede clasificar el polimorfismo en dos grandes clases:
Polimorfismo dinmico (o polimorfismo paramtrico) es aqul en el que el cdigo no
incluye ningn tipo de especificacin sobre el tipo de datos sobre el que se trabaja. As,
puede ser utilizado a todo tipo de datos compatible.
Polimorfismo esttico (o polimorfismo ad hoc) es aqul en el que los tipos a los que se
aplica el polimorfismo deben ser explicitados y declarados uno por uno antes de poder
ser utilizados. El polimorfismo dinmico unido a la herencia es lo que en ocasiones se
conoce como programacin genrica.
Tambin se clasifica en herencia por redefinicin de mtodos abstractos y por mtodo
sobrecargado. El segundo hace referencia al mismo mtodo con diferentes parmetros.
Otra clasificacin agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez
sobrecarga de operadores y coercin, Universal (inclusin o controlado por la herencia,
paramtrico o generalidad).

Referencia:
http://cursos.aiu.edu/Lenguajes%20de%20Programacion%20Orientados%20a%20Objetos/PDF/Tema%204b.pdf
http://c.conclase.net/curso/?cap=036

Polimorfismo. Mtodos virtuales


El polimorfismo indica que una variable pasada o esperada puede adoptar mltiples
formas. Cuando se habla de polimorfismo en programacin orientada a objetos se suelen
entender dos cosas:
1. La primera se refiere a que se puede trabajar con un objeto de una clase sin importar
de qu clase se trata. Es decir, se trabajar igual sea cual sea la clase a la que pertenece el
objeto. Esto se consigue mediante jerarquas de clases y clases abstractas.
2. La segunda suele referirse a la posibilidad de declarar mtodos con el mismo nombre
que pueden tener diferentes argumentos dentro de una misma clase.

Herencia
Una de las principales propiedades de las clases es la herencia. Esta propiedad nos permite
crear nuevas clases a partir de clases existentes, conservando las propiedades de la clase
original y aadiendo otras nuevas.
Jerarqua, clases base y clases derivadas
Cada nueva clase obtenida mediante herencia se conoce como clase derivada, y las clases
a partir de las cuales se deriva, clases base. Adems, cada clase derivada puede usarse
como clase base para obtener una nueva clase derivada. Y cada clase derivada puede serlo
de una o ms clases base. En este ltimo caso hablaremos de derivacin mltiple.
Esto nos permite crear una jerarqua de clases tan compleja como sea necesario.
Bien, pero qu ventajas tiene derivar clases?
En realidad, ese es el principio de la programacin orientada a objetos. Esta propiedad
nos permite encapsular diferentes partes de cualquier objeto real o imaginario, y
vincularlo con objetos ms elaborados del mismo tipo bsico, que heredarn todas sus
caractersticas. Lo veremos mejor con un ejemplo.
Un ejemplo muy socorrido es de las personas. Supongamos que nuestra clase base para
clasificar a las personas en funcin de su profesin sea "Persona". Presta especial atencin
a la palabra "clasificar", es el punto de partida para buscar la solucin de cualquier
problema que se pretenda resolver usando POO. Lo primero que debemos hacer es buscar
categoras, propiedades comunes y distintas que nos permitan clasificar los objetos, y
crear lo que despus sern las clases de nuestro programa. Es muy importante dedicar el
tiempo y atencin necesaria a esta tarea, de ello depender la flexibilidad, reutilizacin y
eficacia de nuestro programa.
Ten en cuenta que las jerarquas de clases se usan especialmente en la resolucin de
problemas complejos, es difcil que tengas que recurrir a ellas para resolver problemas
sencillos.
Siguiendo con el ejemplo, partiremos de la clase "Persona". Independientemente de la
profesin, todas las personas tienen propiedades comunes, nombre, fecha de nacimiento,
gnero, estado civil, etc.
Referencia:
http://cursos.aiu.edu/Lenguajes%20de%20Programacion%20Orientados%20a%20Objetos/PDF/Tema%204b.pdf
http://c.conclase.net/curso/?cap=036

Jerarqua de clases para Persona

La siguiente clasificacin debe ser menos general, supongamos que dividimos a todas las
personas en dos grandes clases: empleados y estudiantes. (Dejaremos de lado, de
momento, a los estudiantes que adems trabajan). Lo importante es decidir qu
propiedades que no hemos incluido en la clase "Persona" son exclusivas de los empleados
y de los estudiantes. Por ejemplo, los ingresos por nmina son exclusivos de los
empleados, la nota media del curso, es exclusiva de los estudiantes. Una vez hecho eso
crearemos dos clases derivadas de Persona: "Empleado" y "Estudiante".
Haremos una nueva clasificacin, ahora de los empleados. Podemos clasificar a los
empleados en ejecutivos y comerciales (y muchas ms clases, pero para el ejemplo nos
limitaremos a esos dos). De nuevo estableceremos propiedades exclusivas de cada clase
y crearemos dos nuevas clases derivadas de "Empleado": "Ejecutivo" y "Comercial".
Ahora veremos las ventajas de disponer de una jerarqua completa de clases.
Cada vez que creemos un objeto de cualquier tipo derivado, por ejemplo de tipo
Comercial, estaremos creando en un slo objeto un Comercial, un Empleado y una
Persona. Nuestro programa puede tratar a ese objeto como si fuera cualquiera de esos tres
tipos. Es decir, nuestro comercial tendr, adems de su propiedad como comercial, su
nmina como empleado, y su nombre, edad y gnero como persona.
Siempre podremos crear nuevas clases para resolver nuevas situaciones. Consideremos
el caso de que en nuestra clasificacin queremos incluir una nueva clase "Becario", que
no es un empleado, ni tampoco un estudiante; la derivaramos de Persona. Tambin
podemos considerar que un becario es ambas cosas. Sera un ejemplo de derivacin
mltiple, podramos hacer que la clase derivada Becario, lo fuera de Empleado y
Estudiante.
Podemos aplicar procedimientos genricos a una clase en concreto, por ejemplo, podemos
aplicar una subida general del salario a todos los empleados, independientemente de su
profesin, si hemos diseado un procedimiento en la clase Empleado para ello.
Veremos que existen ms ventajas, aunque este modo de disear aplicaciones tiene
tambin sus inconvenientes, sobre todo si diseamos mal alguna clase.

Derivar clases, sintaxis


La forma general de declarar clases derivadas es la siguiente:
class <clase_derivada> :
[public|private] <base1> [,[public|private] <base2>] {};
Referencia:
http://cursos.aiu.edu/Lenguajes%20de%20Programacion%20Orientados%20a%20Objetos/PDF/Tema%204b.pdf
http://c.conclase.net/curso/?cap=036

En seguida vemos que para cada clase base podemos definir dos tipos de
acceso, public o private. Si no se especifica ninguno de los dos, por defecto se asume que
es private.
public: los miembros heredados de la clase base conservan el tipo de acceso con que
fueron declarados en ella.
private: todos los miembros heredados de la clase base pasan a ser miembros privados en
la clase derivada.
De momento siempre declararemos las clases base como public, al menos hasta que
veamos la utilidad de hacerlo como privadas.
Veamos un ejemplo sencillo basado en la idea del punto anterior:
// Clase base Persona:
class Persona {
public:
Persona(char *n, int e);
const char *LeerNombre(char *n) const;
int LeerEdad() const;
void CambiarNombre(const char *n);
void CambiarEdad(int e);
protected:
char nombre[40];
int edad;
};
// Clase derivada Empleado:
class Empleado : public Persona {
public:
Empleado(char *n, int e, float s);
float LeerSalario() const;
void CambiarSalario(const float s);
protected:
float salarioAnual;
};
Podrs ver que hemos declarado los datos miembros de nuestras clases como protected.
En general es recomendable declarar siempre los datos de nuestras clases como privados,
de ese modo no son accesibles desde el exterior de la clase y adems, las posibles
modificaciones de esos datos, en cuanto a tipo o tamao, slo requieren ajustes de los
mtodos de la propia clase.
Pero en el caso de estructuras jerrquicas de clases puede ser interesante que las clases
derivadas tengan acceso a los datos miembros de las clases base. Usar el
accesoprotected nos permite que los datos sean inaccesibles desde el exterior de las clases,
pero a la vez, permite que sean accesibles desde las clases derivadas.
Referencia:
http://cursos.aiu.edu/Lenguajes%20de%20Programacion%20Orientados%20a%20Objetos/PDF/Tema%204b.pdf
http://c.conclase.net/curso/?cap=036

Você também pode gostar