Movatterモバイル変換


[0]ホーム

URL:


Ir al contenido
WikipediaLa enciclopedia libre
Buscar

Polimorfismo (informática)

De Wikipedia, la enciclopedia libre
(Redirigido desde «Polimorfismo (programación orientada a objetos)»)
No debe confundirse conPolimorfismo en el malware.

Enprogramación orientada a objetos, elpolimorfismo se refiere a la propiedad por la que es posible enviar mensajes sintácticamente iguales aobjetos detipos distintos. Aunque el mensaje sea el mismo, diferentes objetos pueden responder a él de manera única y específica. Esta característica permite que, sin alterar ni tocar el código existente, se puedan incorporar nuevos comportamientos y funciones (es decir la interfaz sintáctica se mantiene inalterada pero cambia el comportamiento en función de qué objeto estamos usando en cada momento). El único requisito es que los objetos deben ser capaces de responder al mensaje que se les envía, garantizando así una flexibilidad y extensibilidad en el diseño del software.

Descripción

[editar]

En lenguajes basados en clases y con unsistema de tipos de datos fuerte (independientemente de si la verificación se realiza entiempo 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 denominadasinterfaces (esta técnica se conoce comocomposició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 entiempo 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]

EnJava las interfaces se declaran mediante la palabra claveInterface. 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 laherencia 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, comoSelf, 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 yAve que heredan de lasuperclaseAnimal. LaclaseAnimal tiene el método abstractomover quese 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 mensajemover a un grupo de objetosPez yAve por medio de una variable de referencia de claseAnimal, haciendo así un uso polimórfico de dichos objetos respecto del mensajemover.

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 defunciones polimórficas ytipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; lostipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.

Clasificación

[editar]

Se puede clasificar el polimorfismo en dos grandes clases:

  • Polimorfismo dinámico (opolimorfismo 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 (opolimorfismoad 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 comoprogramació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

[editar]

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 clasesUML, 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>usingnamespacestd;classFigura{protected:floatbase;floataltura;public:voidcaptura();virtualfloatperimetro()=0;virtualfloatarea()=0;};classRectangulo:publicFigura{public:voidimprime();floatperimetro(){return2*(base+altura);}floatarea(){returnbase*altura;}};classTriangulo:publicFigura{public:voidmuestra();floatperimetro(){return2*sqrt(pow(altura,2)+pow((base/2),2))+base;}//Usando pitágorasfloatarea(){return(base*altura)/2;}};voidFigura::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();return0;}

Polimorfismo desde una interfaz

[editar]

Aunque la aplicación del polimorfismo no varía, el modo en que se aplica desde unainterfaz puede resultar un poco más oscuro y difícil de entender. Se expone un sencillo ejemplo (en VB-NET) comentado para entender cómo 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:InterfaceIOperarFunctionOperar(valor1AsInteger,valor2AsInteger)AsLongEndInterface
' 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:ClassOperacionFunctionCalcular(clasellamanteAsObject)AsLong' 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 sitioDimvalor1AsInteger=InputValor()Dimvalor2AsInteger=InputValor()Returnop.Operar(valor1,valor2)'AQUÍ es donde se utiliza el polimorfismo.EndFunctionFunctionInputValor()AsIntegerDimresultadoAsIntegerDoConsole.WriteLine("Ingrese un número entero")' Ciclo infinito hasta leer un entero válidoLoopUntilInt32.TryParse(Console.ReadLine(),resultado)ReturnresultadoEndFunctionEndClass
' Declaramos 2 clases: Sumar y Restar que implementan la interfaz y que llaman a la clase Operacion:ClassSumarImplementsIOperarPrivateFunctionOperar(valor1AsInteger,valor2AsInteger)AsLongImplementsIOperar.OperarReturnvalor1+valor2EndFunctionFunctionCalcular()AsLongDimopAsNewOperacionReturnop.Calcular(Me)' se está llamando a la función 'Calcular' de la clase 'Operación'EndFunctionEndClass
' segunda clase....ClassRestarImplementsIOperarPrivateFunctionOperar(valor1AsInteger,valor2AsInteger)AsLongImplementsIOperar.OperarReturnvalor1-valor2EndFunctionFunctionCalcular()AsLongDimopAsNewOperacionReturnop.Calcular(Me)' se está llamando a la función 'Calcular' de la clase 'Operación'EndFunctionEndClass

Analicemos ahora el código para entender elpolimorfismo expuesto en la interfaz: La interfaz expone un método que puede ser implementado por las diferentes clases, normalmente relacionadas entre sí. Las clasesSumar yRestar 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 llamadoCalcular que llama a la claseOperació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 variableOP en el métodoCalcular de la claseOperación, que a su vez recibió la referencia del métodoCalcular desde la clase que la llama, sea ésta cual sea, se identifica a sí misma, mediante la referenciaMe oThis 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

[editar]

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 claseMultiplicar), basta con recompilar todo el código que incluye los nuevos tipos añadidos. Si se hubiera recurrido a lasobrecarga durante eldiseño exigiría retocar la clase anteriormente creada al añadir la nueva operaciónMultiplicar, 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

[editar]
  1. GAMMA et al, Erich (2003).Patrones de diseño. Addison Wesley. pp. 15-18.ISBN 84-7829-059-1. 
Control de autoridades
Obtenido de «https://es.wikipedia.org/w/index.php?title=Polimorfismo_(informática)&oldid=166386283»
Categoría:

[8]ページ先頭

©2009-2025 Movatter.jp