fbpx
Wikipedia

Polimorfismo (informática)

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.

Descripción

En lenguajes basados en clases y con un sistema de tipos de datos fuerte (independientemente de si la verificación se realiza en tiempo de compilación o de ejecución), es posible que el único modo de poder utilizar objetos de manera polimórfica sea que compartan una raíz común, es decir, una jerarquía de clases, ya que esto proporciona la compatibilidad de tipos de datos necesaria para que sea posible utilizar una misma variable de referencia (que podrá apuntar a objetos de diversas subclases de dicha jerarquía) para enviar el mismo mensaje (o un grupo de mensajes) al grupo de objetos que se tratan de manera polimórfica.

No obstante, algunos lenguajes de programación (Java, C++) permiten que dos objetos de distintas jerarquías de clases respondan a los mismos mensajes, a través de las denominadas interfaces (esta técnica se conoce como composición de objetos). Dos objetos que implementen la misma interfaz podrán ser tratados de forma idéntica, como un mismo tipo de objeto, el tipo definido por la interfaz. Así, distintos objetos podrán intercambiarse en tiempo de ejecución –siempre que sean del mismo tipo–, y además con dependencias mínimas entre ellos. Por estos motivos se considera un buen principio de diseño en programación orientada a objetos el favorecer la composición de objetos frente a la herencia de clases.[1]

En Java las interfaces se declaran mediante la palabra clave Interface. Estas se utilizan para lograr la necesaria concordancia de tipos que hace posible el polimorfismo, también como un contrato que debe cumplir cualquier clase que implemente una cierta interfaz, y como una forma de documentación para los desarrolladores. A veces, en la literatura específica sobre Java se habla de "herencia y polimorfismo de interfaces", lo que no concuerda con los conceptos de la programación orientada a objetos porque una clase que implementa una interfaz sólo obtiene su tipo de datos y la obligación de implementar sus métodos, no copia comportamiento ni atributos. Esta terminología puede llevar a confusión, puesto que en Java a menudo se utiliza la mal llamada "herencia de interfaces" para dotar a una clase de uno o varios tipos adicionales, lo que unido a la composición, evite la necesidad de la herencia múltiple y favorezca una utilización más amplia del polimorfismo.

No obstante, el uso de una jerarquía de clases como paso previo, es muy habitual incluso en aquellos lenguajes en los que es posible prescindir de tal jerarquía, ya que, desde una perspectiva conceptual, se puede decir que al pertenecer los "objetos polimórficos" a subclases de una misma jerarquía, se asegura la equivalencia semántica de los mensajes que se invocarán de modo polimórfico. Por esto, en programación orientada a objetos a veces se denomina al polimorfismo como "polimorfismo de subclase (o de subtipo)".

En resumen, en la programación orientada a objetos, la esencia del polimorfismo no atañe a la clase o prototipo de la que provienen los objetos. Aun así, en los lenguajes basados en clases, es habitual (y en algunos tal vez sea el único modo) que dichos objetos pertenezcan a subclases pertenecientes a una misma jerarquía. Entonces, el polimorfismo debe verse como una forma flexible de usar un grupo de objetos (como si fueran sólo uno). Podría decirse que el polimorfismo en esencia refiere al comportamiento de los objetos, no a su pertenencia a una jerarquía de clases (o a sus tipos de datos).

Lo anterior se hace aún más evidente en lenguajes de programación orientada a objetos basados en prototipos, como Self, en los que las clases no existen.

Además, es importante remarcar que si un cierto grupo de objetos pueden utilizarse de manera polimórfica es porque, en última instancia, todos ellos saben responder a un cierto mensaje (o a varios), pero dado que esos mismos objetos generalmente contendrán otros métodos (que otros objetos en dicho grupo no contienen), difícilmente se pueda decir lisa y llanamente que los objetos son polimórficos; lo correcto es decir que esos objetos se pueden utilizar de modo polimórfico para un cierto conjunto de mensajes.

Un ejemplo. Podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase Animal tiene el método abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta). Entonces, un tercer objeto puede enviar el mensaje mover a un grupo de objetos Pez y Ave por medio de una variable de referencia de clase Animal, haciendo así un uso polimórfico de dichos objetos respecto del mensaje mover.

El concepto de polimorfismo, desde una perspectiva más general, se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.

Clasificación

Se puede clasificar el polimorfismo en dos grandes clases:

  • Polimorfismo dinámico (o polimorfismo paramétrico) es aquel en el que el código no incluye ningún tipo de especificación sobre el tipo de datos sobre el que se trabaja. Así, puede ser utilizado a todo tipo de datos compatible.
  • Polimorfismo estático (o polimorfismo ad hoc) es aquél en el que los tipos a los que se aplica el polimorfismo deben ser explícitos y declarados uno por uno antes de poder ser utilizados.

El polimorfismo dinámico unido a la herencia es lo que en ocasiones se conoce como programación genérica.

También se clasifica en herencia por redefinición de métodos abstractos y por método sobrecargado. El segundo hace referencia al mismo método con diferentes parámetros.

Otra clasificación agrupa los polimorfismo en dos tipos: Ad-Hoc que incluye a su vez sobrecarga de operadores y coerción, Universal (inclusión o controlado por la herencia, paramétrico o genericidad).

Ejemplo de polimorfismo

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.

 
Diagrama de clases UML, que describe gráficamente la relación entre la clase base Figura y sus posibles clases derivadas, y la entidad que utiliza esta estructura: la Aplicación, también identificado como objeto Cliente.
#include<iostream> #include <math.h> using namespace std; class Figura { private: float base; float altura; public: void captura(); virtual float perimetro()=0; virtual float area()=0; }; class Rectangulo: public Figura { public: void imprime(); float perimetro(){return 2*(base+altura);} float area(){return base*altura;} }; class Triangulo: public Figura { public: void muestra(); float perimetro(){return 2*sqrt(pow(altura,2)+pow((base/2),2))+base;} //Usando pitágoras 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() << endl; cout << "EL AREA ES: " << area() << endl; getchar(); return 0; } 

Polimorfismo desde una interfaz

Aunque la aplicación del polimorfismo no varía, 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 Dim valor1 As Integer = InputValor() Dim valor2 As Integer = InputValor() Dim op As IOperar = clasellamante Return op.Operar(valor1, valor2) 'AQUÍ es donde se utiliza el polimorfismo. End Function Function InputValor() As Integer Dim resultado As Integer Do Console.WriteLine("Ingrese un número entero") ' Ciclo infinito hasta leer un entero válido Loop Until Int32.TryParse(Console.ReadLine(), resultado) Return resultado 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 Dim 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 Dim 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 

Analicemos ahora el código para entender el polimorfismo expuesto en la interfaz: La interfaz expone un método que puede ser implementado por las diferentes clases, normalmente relacionadas entre sí. 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 Calcular que 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 o 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.

Diferencias entre polimorfismo y sobrecarga

El polimorfismo como se muestra en el ejemplo anterior, suele ser bastante ventajoso aplicado desde las interfaces, ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes (imaginemos que deseamos añadir una clase Multiplicar), basta con recompilar todo el código que incluye los nuevos tipos añadidos. Si se hubiera recurrido a la sobrecarga durante el diseño exigiría retocar la clase anteriormente creada al añadir la nueva operación Multiplicar, lo que además podría suponer revisar todo el código donde se instancia a la clase.

  • Un método está sobrecargado si dentro de una clase existen dos o más declaraciones de dicho método con el mismo nombre pero con parámetros distintos, por lo que no hay que confundirlo con polimorfismo.
  • En definitiva: La sobrecarga se resuelve en tiempo de compilación utilizando los nombres de los métodos y los tipos de sus parámetros; el polimorfismo se resuelve en tiempo de ejecución del programa, esto es, mientras se ejecuta, en función de la clase a la que pertenece el objeto.

Referencias

  1. GAMMA et al, Erich (2003). Patrones de diseño. Addison Wesley. pp. 15-18. ISBN 84-7829-059-1. 
  •   Datos: Q3240252

polimorfismo, informática, debe, confundirse, polimorfismo, malware, programación, orientada, objetos, polimorfismo, refiere, propiedad, posible, enviar, mensajes, sintácticamente, iguales, objetos, tipos, distintos, único, requisito, deben, cumplir, objetos, . No debe confundirse con Polimorfismo en el malware En programacion orientada a objetos el polimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintacticamente iguales a objetos de tipos distintos El unico requisito que deben cumplir los objetos que se utilizan de manera polimorfica es saber responder al mensaje que se les envia La apariencia del codigo puede ser muy diferente dependiendo del lenguaje que se utilice mas alla de las obvias diferencias sintacticas Indice 1 Descripcion 2 Clasificacion 3 Ejemplo de polimorfismo 4 Polimorfismo desde una interfaz 5 Diferencias entre polimorfismo y sobrecarga 6 ReferenciasDescripcion EditarEn lenguajes basados en clases y con un sistema de tipos de datos fuerte independientemente de si la verificacion se realiza en tiempo de compilacion o de ejecucion es posible que el unico modo de poder utilizar objetos de manera polimorfica sea que compartan una raiz comun es decir una jerarquia de clases ya que esto proporciona la compatibilidad de tipos de datos necesaria para que sea posible utilizar una misma variable de referencia que podra apuntar a objetos de diversas subclases de dicha jerarquia para enviar el mismo mensaje o un grupo de mensajes al grupo de objetos que se tratan de manera polimorfica No obstante algunos lenguajes de programacion Java C permiten que dos objetos de distintas jerarquias de clases respondan a los mismos mensajes a traves de las denominadas interfaces esta tecnica se conoce como composicion de objetos Dos objetos que implementen la misma interfaz podran ser tratados de forma identica como un mismo tipo de objeto el tipo definido por la interfaz Asi distintos objetos podran intercambiarse en tiempo de ejecucion siempre que sean del mismo tipo y ademas con dependencias minimas entre ellos Por estos motivos se considera un buen principio de diseno en programacion orientada a objetos el favorecer la composicion de objetos frente a la herencia de clases 1 En Java las interfaces se declaran mediante la palabra clave Interface Estas se utilizan para lograr la necesaria concordancia de tipos que hace posible el polimorfismo tambien como un contrato que debe cumplir cualquier clase que implemente una cierta interfaz y como una forma de documentacion para los desarrolladores A veces en la literatura especifica sobre Java se habla de herencia y polimorfismo de interfaces lo que no concuerda con los conceptos de la programacion orientada a objetos porque una clase que implementa una interfaz solo obtiene su tipo de datos y la obligacion de implementar sus metodos no copia comportamiento ni atributos Esta terminologia puede llevar a confusion puesto que en Java a menudo se utiliza la mal llamada herencia de interfaces para dotar a una clase de uno o varios tipos adicionales lo que unido a la composicion evite la necesidad de la herencia multiple y favorezca una utilizacion mas amplia del polimorfismo No obstante el uso de una jerarquia de clases como paso previo es muy habitual incluso en aquellos lenguajes en los que es posible prescindir de tal jerarquia ya que desde una perspectiva conceptual se puede decir que al pertenecer los objetos polimorficos a subclases de una misma jerarquia se asegura la equivalencia semantica de los mensajes que se invocaran de modo polimorfico Por esto en programacion orientada a objetos a veces se denomina al polimorfismo como polimorfismo de subclase o de subtipo En resumen en la programacion orientada a objetos la esencia del polimorfismo no atane a la clase o prototipo de la que provienen los objetos Aun asi en los lenguajes basados en clases es habitual y en algunos tal vez sea el unico modo que dichos objetos pertenezcan a subclases pertenecientes a una misma jerarquia Entonces el polimorfismo debe verse como una forma flexible de usar un grupo de objetos como si fueran solo uno Podria decirse que el polimorfismo en esencia refiere al comportamiento de los objetos no a su pertenencia a una jerarquia de clases o a sus tipos de datos Lo anterior se hace aun mas evidente en lenguajes de programacion orientada a objetos basados en prototipos como Self en los que las clases no existen Ademas es importante remarcar que si un cierto grupo de objetos pueden utilizarse de manera polimorfica es porque en ultima instancia todos ellos saben responder a un cierto mensaje o a varios pero dado que esos mismos objetos generalmente contendran otros metodos que otros objetos en dicho grupo no contienen dificilmente se pueda decir lisa y llanamente que los objetos son polimorficos lo correcto es decir que esos objetos se pueden utilizar de modo polimorfico para un cierto conjunto de mensajes Un ejemplo Podemos crear dos clases distintas Pez y Ave que heredan de la superclase Animal La clase Animal tiene el metodo abstracto mover que se implementa de forma distinta en cada una de las subclases peces y aves se mueven de forma distinta Entonces un tercer objeto puede enviar el mensaje mover a un grupo de objetos Pez y Ave por medio de una variable de referencia de clase Animal haciendo asi un uso polimorfico de dichos objetos respecto del mensaje mover El concepto de polimorfismo desde una perspectiva mas general se puede aplicar tanto a funciones como a tipos de datos Asi nacen los conceptos de funciones polimorficas y tipos polimorficos Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta los tipos polimorficos por su parte son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no esta especificado Clasificacion EditarSe puede clasificar el polimorfismo en dos grandes clases Polimorfismo dinamico o polimorfismo parametrico es aquel en el que el codigo no incluye ningun tipo de especificacion sobre el tipo de datos sobre el que se trabaja Asi puede ser utilizado a todo tipo de datos compatible Polimorfismo estatico o polimorfismo ad hoc es aquel en el que los tipos a los que se aplica el polimorfismo deben ser explicitos y declarados uno por uno antes de poder ser utilizados El polimorfismo dinamico unido a la herencia es lo que en ocasiones se conoce como programacion generica Tambien se clasifica en herencia por redefinicion de metodos abstractos y por metodo sobrecargado El segundo hace referencia al mismo metodo con diferentes parametros Otra clasificacion agrupa los polimorfismo en dos tipos Ad Hoc que incluye a su vez sobrecarga de operadores y coercion Universal inclusion o controlado por la herencia parametrico o genericidad Ejemplo de polimorfismo EditarEn 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 mas consistente cuando se trabaja con una jerarquia de clases puesto que hacen posible el enlace durante la ejecucion Sin embargo como se vera para que el polimorfismo funcione no es una condicion obligatoria que todas las funciones en la clase base sean declaradas como virtuales Diagrama de clases UML que describe graficamente la relacion entre la clase base Figura y sus posibles clases derivadas y la entidad que utiliza esta estructura la Aplicacion tambien identificado como objeto Cliente include lt iostream gt include lt math h gt using namespace std class Figura private float base float altura public void captura virtual float perimetro 0 virtual float area 0 class Rectangulo public Figura public void imprime float perimetro return 2 base altura float area return base altura class Triangulo public Figura public void muestra float perimetro return 2 sqrt pow altura 2 pow base 2 2 base Usando pitagoras float area return base altura 2 void Figura captura cout lt lt CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISoSCELES Y UN RECTANGULO lt lt endl cout lt lt escribe la altura cin gt gt altura cout lt lt escribe la base cin gt gt base cout lt lt EL PERIMETRO ES lt lt perimetro lt lt endl cout lt lt EL AREA ES lt lt area lt lt endl getchar return 0 Polimorfismo desde una interfaz EditarAunque la aplicacion del polimorfismo no varia el modo en que se aplica desde una interfaz puede resultar un poco mas oscuro y dificil de entender Se expone un sencillo ejemplo en VB NET comentado para entender como funciona aplicado desde una interfaz primero se escribe el codigo y luego se comenta el funcionamiento Nota para no enturbiar el codigo en exceso todo lo que no se declara privado se sobreentiende publico Declaramos una interfaz llamada IOperar y declaramos una funcion llamada Operar que implementaran las clases deseadas Interface IOperar Function Operar valor1 As Integer valor2 As Integer As Long End Interface Declaramos una clase que trabaja mas alejada del usuario y que contendria funciones comunes para las siguiente clase si no fueran identicas irian en la interfaz pero al caso de mostrar el polimorfismo se suponen identicas Class Operacion Function Calcular clasellamante As Object As Long aqui iria el codigo comun a todas las operaciones que llaman a esa funcion por ejemplo recoger los 2 valores de la operacion chequear que estan en el rango deseado etc se supone que la funcion inputValor recoge un valor de algun sitio Dim valor1 As Integer InputValor Dim valor2 As Integer InputValor Dim op As IOperar clasellamante Return op Operar valor1 valor2 AQUI es donde se utiliza el polimorfismo End Function Function InputValor As Integer Dim resultado As Integer Do Console WriteLine Ingrese un numero entero Ciclo infinito hasta leer un entero valido Loop Until Int32 TryParse Console ReadLine resultado Return resultado 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 Dim op As New Operacion Return op Calcular Me se esta llamando a la funcion Calcular de la clase Operacion 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 Dim op As New Operacion Return op Calcular Me se esta llamando a la funcion Calcular de la clase Operacion End Function End Class Analicemos ahora el codigo para entender el polimorfismo expuesto en la interfaz La interfaz expone un metodo que puede ser implementado por las diferentes clases normalmente relacionadas entre si Las clases Sumar y Restar implementan la interfaz pero el metodo de la interfaz lo declaramos privado para evitar ser accedido libremente y ademas tienen un metodo llamado Calcular que llama a la clase Operacion donde tenemos otro metodo con el mismo nombre Es esta clase ultima la que realiza el polimorfismo y debe fijarse como es a traves de una instancia de la interfaz que llama al metodo operar La interfaz sabe a que metodo de que clase llamar desde el momento que asignamos un valor a la variable OP en el metodo Calcular de la clase Operacion que a su vez recibio la referencia del metodo Calcular desde la clase que la llama sea esta cual sea se identifica a si misma mediante la referencia Me o This segun el lenguaje empleado Debe notarse que la instancia de la interfaz accede a sus metodos aunque en sus clases se hayan declarado privadas Diferencias entre polimorfismo y sobrecarga EditarEl polimorfismo como se muestra en el ejemplo anterior suele ser bastante ventajoso aplicado desde las interfaces ya que permite crear nuevos tipos sin necesidad de tocar las clases ya existentes imaginemos que deseamos anadir una clase Multiplicar basta con recompilar todo el codigo que incluye los nuevos tipos anadidos Si se hubiera recurrido a la sobrecarga durante el diseno exigiria retocar la clase anteriormente creada al anadir la nueva operacion Multiplicar lo que ademas podria suponer revisar todo el codigo donde se instancia a la clase Un metodo esta sobrecargado si dentro de una clase existen dos o mas declaraciones de dicho metodo con el mismo nombre pero con parametros distintos por lo que no hay que confundirlo con polimorfismo En definitiva La sobrecarga se resuelve en tiempo de compilacion utilizando los nombres de los metodos y los tipos de sus parametros el polimorfismo se resuelve en tiempo de ejecucion del programa esto es mientras se ejecuta en funcion de la clase a la que pertenece el objeto Referencias Editar GAMMA et al Erich 2003 Patrones de diseno Addison Wesley pp 15 18 ISBN 84 7829 059 1 Datos Q3240252Obtenido de https es wikipedia org w index php title Polimorfismo informatica amp oldid 133993303, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos