En programación orientada a objetos, el polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos. El único requisito que deben cumplir los objetos que se utilizan de manera polimórfica es saber responder al mensaje que se les envía.
La apariencia del código puede ser muy diferente dependiendo del lenguaje que se utilice, más allá de las obvias diferencias sintácticas.
Por ejemplo, en un lenguaje de programación que cuenta con un sistema de tipos dinámico (en los que las variables pueden contener datos de cualquier tipo u objetos de cualquier clase) como Smalltalk no se requiere que los objetos que se utilizan de modo polimórfico sean parte de una jerarquía de clases.
En el siguiente ejemplo hacemos uso del lenguaje C++ para ilustrar el polimorfismo. Se observa a la vez el uso de las funciones virtuales puras, como se les conoce en C++, estas funciones constituyen una interfaz más consistente cuando se trabaja con una jerarquía de clases, puesto que hacen posible el enlace durante la ejecución. Sin embargo como se verá, para que el polimorfismo funcione no es una condición obligatoria que todas las funciones en la clase base sean declaradas como virtuales.
#include<iostream>
using namespace std;
class Figura {
private:
float base;
float altura;
public:
void captura();
virtual unsigned float perimetro()=0;
virtual unsigned float area()=0;
};
class Rectangulo: public Figura {
public:
void imprime();
unsigned float perimetro(){return 2*(base+altura);}
unsigned float area(){return base*altura;}
};
class Triangulo: public Figura {
public:
void muestra();
unsigned float perimetro(){return 2*altura+base}
unsigned float area(){return (base*altura)/2;}
};
void Figura::captura()
{
cout << "CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISÓSCELES Y UN RECTANGULO:" << endl;
cout << "escribe la altura: ";
cin >> altura;
cout << "escribe la base: ";
cin >> base;
cout << "EL PERIMETRO ES: " << perimetro();
cout << "EL AREA ES: " << area();
getchar();
return 0;
}
Polimorfismo desde una interfaz[
Aunque el polimorfismo es el mismo se aplique donde se aplique, el modo en que se aplica desde una interfaz puede resultar un poco más oscuro y difícil de entender. Se expone un sencillo ejemplo (en VB-NET) comentado para entender como funciona aplicado desde una interfaz, primero se escribe el código y luego se comenta el funcionamiento. Nota: para no enturbiar el código en exceso, todo lo que no se declara privado se sobreentiende público.
' Declaramos una interfaz llamada IOperar y declaramos una función llamada Operar
' que implementarán las clases deseadas:
Interface IOperar
Function Operar(valor1 as integer, valor2 as integer) as long
End Interface
' Declaramos una clase que trabaja más alejada del usuario y que contendría funciones comunes
' para las siguiente clase, si no fueran idénticas irían en la interfaz,
' pero al caso de mostrar el polimorfismo se suponen idénticas:
Class Operacion
Function Calcular(clasellamante as Object) as Long
' aquí iría el código común a todas las operaciones.... que llaman a esa función
' por ejemplo recoger los 2 valores de la operación, chequear que están en el rango deseado, etc.
' se supone que la función inputValor recoge un valor de algún sitio
valor1 as integer = inputValor()
valor2 as integer = inputValor()
op as New IOperar = clasellamante
Return op.Operar(valor1,valor2) 'AQUÍ es donde se utiliza el polimorfismo.
End Function
End Class
' Declaramos 2 clases: Sumar y Restar que implementan la interfaz y que llaman a la clase Operacion:
Class Sumar
Implements IOperar
Private Function Operar(valor1 as Integer, valor2 as Integer) as Long Implements IOperar.Operar
Return valor1 + valor2
End Function
Function Calcular() as Long
op as New operacion
Return op.Calcular(Me) ' se está llamando a la función 'Calcular' de la clase 'Operación'
End Function
End Class
' segunda clase....
Class Restar
Implements IOperar
Private Function Operar(valor1 as Integer, valor2 as Integer) as Long Implements IOperar.Operar
Return valor1 - valor2
End Function
Function Calcular() as Long
op as New operacion
Return op.Calcular(Me) ' se está llamando a la función 'Calcular' de la clase 'Operación'
End Function
End Class
La interfaz expone un método que puede ser implementado por las diferentes clases, normalmente relacionadas entre si. Las clases Sumar y Restar implementan la interfaz pero el método de la interfaz lo declaramos privado para evitar ser accedido libremente y además tienen un método llamado Calcularque llama a la clase Operación donde tenemos otro método con el mismo nombre. Es esta clase última la que realiza el polimorfismo y debe fijarse como es a través de una instancia de la interfaz que llama al método operar. La interfaz sabe a qué método de qué clase llamar desde el momento que asignamos un valor a la variable OP en el método Calcular de la clase Operación, que a su vez recibió la referencia del método Calcular desde la clase que la llama, sea ésta cual sea, se identifica a sí misma, mediante la referencia Me ó This según el lenguaje empleado. Debe notarse que la instancia de la interfaz accede a sus métodos aunque en sus clases se hayan declarado privadas.
PARA VER EL
FUNCIONAMIENTO DEL PROGRAMA DE EJEMPLO, DIRIGIRSE A ESTE ENLACE DONDE COPIE Y
PEGUE EL EJEMPLO .
No hay comentarios:
Publicar un comentario