Polimorfismo

El Polimorfismo es uno de los 4 pilares de la programación orientada a objetos (POO) junto con la Abstracción, Encapsulación y Herencia.

"Polimorfismo" es una palabra de origen griego que significa "muchasformas". Este termino se utiliza en la POO para "referirse a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tipos distintos".

En programación orientada a objetos, el polimorfismo o poliformismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales a objetos de tiposdistintos. 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.

Algunos tipos de polimorfismo: el polimorfismo paramétrico (también llamado polimorfismo de plantillas) y el polimorfismo de inclusión (también llamado redefinición o subtipado).

-Polimorfismo paramétrico: El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente el método correcto a aplicar en función del tipo de datos pasados en el parámetro. 
-Poliformulismo de subtipado: La habilidad para redefinir un método en clases que se hereda de una clase base se llama especialización. Por lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica). 

Ejempo:




La clase forma define los métodos dibujar y borrar. En la definición de estos métodos se implementará el código común a todos los objetos de la clase. Sin embargo cuando definamos las clases hijas, círculo y cuadrado, será necesario modificar estos métodos para adaptarlos a las nuevas subclases. El método de la clase padre implementa aquellas acciones comunes. Las clases hijas añaden las operaciones particulares que necesiten. Cuando utilicemos los métodos de la clase forma no tendremos que hacer distinción entre cuadrados y círculos. Gracias al polimorfismo se ejecutará el método adecuado en función de la subclase a la que pertenezca el objeto.


Polimorfismo en la sobrecarga

Si para cada funcionalidad necesitada fuese necesario escribir un método, el código resultante sería inmanejable, imagínense, por ejemplo que los desarrolladores de java hubiesen creado un método para escribir en pantalla una cadena de texto, otro diferente para escribir un entero, otro para escribir un doble, otro para escribir un carácter, otro para una cadena y un entero y así para todas las combinaciones posibles, seria casi imposible conocer dichos métodos en totalidad; en cambio sabemos que con “System.out.print()” o “System.out.println()” podemos escribir cualquier mensaje en pantalla.

Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Dos funciones, procedimientos u operadores que se llaman igual se distinguen por el tipo de sus argumentos o por el número de sus argumentos.

"SumaGenerica" que aglutinara las sumas de todos los tipos primitivos:
class SumaGenerica {
int suma (int a, int b) {
return a+b; }
double suma (double a, double b) {
return a+b; } }

En este caso se dice que el método está sobrecargado y el proceso de definir un método así se conoce como sobrecarga del método. La sobrecarga de métodos es una de las maneras en que Java implementa el polimorfismo.


Polimorfismo en el reemplazo

El poliformulismo en el reemplazo, también conocido como enlace tardío o enlace dinámico tendrá un texto que será diferente de acuerdo a una serie de enlaces. Por consiguiente, estos enlaces dinámicos cambiarán de forma aleatoria.  En el tipo de enlace dinámico, entonces se establece una biblioteca de código, que esta entrelaza cuando se ejecuta una aplicación o un programa.

 El reemplazo ocurre cuando un método en una clase tiene el mismo prototipo (nombre, tipo y orden de los parámetros) que un método de una clase madre (o superclase). En caso de que los métodos tengan el mismo prototipo, el método de la clase derivada, siempre reemplaza al de la clase madre.

Los objetos pueden venir de cualquier sitio, el sitio
indicado se enlaza en tiempo de ejecución.

Ejemplo:

si tienes la clase A y la clase B extends A, y en ambas clases tienes el método imprimeClase(); donde imprimen A y B respectivamente:

Si haces A primera = new A(); primera.imprimeClase(); -> imprimirá A (está llamando al método de la clase A)
Si haces B segunda = new B(); segunda.imprimeClase(); -> imprimirá B (está llamando al método de la clase B)
Si haces A tercera = new B(); tercera.imprimeClase(); -> imprimirá B (está llamando al método de la clase B, ya que es la original, aunque la variable donde está metido sea A, el supertipo)
Conclusión, el enlace dinámico lo que hace es llamar al método original de la clase, da igual si lo has metido en una variable supertipo (véase la tercera opción




Comentarios

Entradas más populares de este blog

Clases Abstractas

Herencia

Interfaces