ĀæQuieres saber que es el Polimorfismo? En el siguiente artĆculo, te daremos una detallada información sobre lo que es el denominado Polimorfismo en programación orientada a objetos.

Polimorfismo en programación orientada a objetos
Aunque pueda parecer una palabra con una descripción algo compleja, realmente este tipo de tema relacionado a la informÔtica se relaciona a aspectos totalmente bÔsicos de la misma. Cuando se aprende Programación Orientada a Objetos, podemos toparnos con esta descripción, cuyo significado es sencillamente la descripción de múltiples y posibles estados de una única propiedad.
Para la informĆ”tica, es una de las propiedades fundamentales para la programación orientada a objetos y es tambiĆ©n una tĆ©cnica utilizada para virus informĆ”ticos o gusanos para modificar partes de su código dificultando su detección. Esto puede facilitar mucho las cosas a la hora de programar algo cuando no queremos ser tan especĆficos y necesitamos algo mĆ”s funcional que se adapte a una manera mĆ”s amplia de trabajar, que nos reduzca el trabajo y nos ayude a poder manejar algo mĆ”s dinĆ”mico y flexible.
Antes de saltar directo al grano estaremos explicando algunos conceptos y desglosando definiciones que nos servirÔn como abreboca, no solo para entenderlo mejor, sino para entender su funcionamiento, su importancia, y lo útil que nos puede ser en el campo de la informÔtica, ayudÔndonos a relajar nuestro trabajo. Posiblemente no encontraremos nada nuevo antes de saltar directamente al polimorfismo en programación orientada a objetos, pero es importante tener todo lo siguiente en cuenta para poder comprender apropiadamente.
El concepto de polimorfismo en programación orientada a objetos tiene su origen en el Simula 67, el cual es un lenguaje de programación, hecho para realizar simulaciones. Esto fue creado por Ole Joha Dahl y Kristen Nygaard quienes pertenecĆan al centro de cómputo noruego en Oslo.
Este centro se dedicaba a la simulación de naves, hubo mucha confusión por la explosión por la diferencias entre unas y otras, cuando estas naves fueron agrupadas por su respectiva clasificación para generar mÔs control al momento de hacer los estudios fue entonces cuando esta idea salió a flote.
Este estilo de programación en los aƱos 80ās predominaba en casi todos los Ć”mbitos de la informĆ”tica por su gran atribución con C++ que es otro lenguaje de programación C. Gracias a las interfaces grĆ”ficas de usuario la dominación de este mĆ©todo funciono muy bien.
El polimorfismo en programación orientado a objetos posee diversas caracterĆsticas, las cuales fueron aplicadas en diferentes lenguajes que se usaban en esa Ć©poca como lo son: Ada, BASIC, LISP, Pascal, entre muchos otros, aunque estos desarrollaron diversos problemas de compatibilidad.
Para una explicación mĆ”s detallada sobre lo que es el Polimorfismo en programación orientada a objetos, te invitamos a ver el siguiente vĆdeo:
El Polimorfismo y la Herencia
El prefijo poli tiene su origen en el griego por lo que su descripción exacta quiere decir abundancia, muchos o variedad, y morfismo es un sufijo griego que entra en la formación de palabras con el significado de forma, composición, o estructura de un cuerpo. Tomando esto en cuenta, podemos adentrarnos en lo que queremos explicar en este fragmento, nuestra palabra protagonista es bÔsicamente por definición una variedad formada por la estructura de un cuerpo; en varios campos de las matemÔticas, se llaman morfismos a las aplicaciones entre estructuras matemÔticas que preservan la estructura interna.
Para poder dejar esto completamente claro, podemos comparar polimorfismo y herencia. Es decir que esto nos permite lleva a cabo los polimorfismo en jerarquĆas de clasificación. es importante ademĆ”s mencionar que estos se dan a travĆ©s de herencia, siempre y cuando, la herencia, que podrĆamos entender como derivados de un objeto, siempre pertenezca a la misma clase; para poner un ejemplo de lo explicado, podemos decir que de la palabra vehĆculo, se desprenden varias clases, como lo serĆa un auto, una moto, y un autobĆŗs, viĆ©ndolo de esta manera, el polimorfismo y la herencia son dos conceptos innegablemente ligados.
La importancia del Sistema de Tipos en el Polimorfismo
Nombrando a esta clasificación como sistema de tipos, porque los derivados de esa palabra siguen formando parte de ellas, pero ¿Por qué es este importante en el polimorfismo en programación orientada a objetos?.
Muchas de las personas que entraron en este artĆculo, podrĆan estar familiarizados con lo que es programar en lenguajes dĆ©bilmente tipados, como lo serĆa en el caso de Javascript y PHP, de todos modos es importante que entendamos bien cómo es.
En este tipo de lenguajes, al definir una variable, siempre tenemos que seƱalar el tipo que queremos que contenga esa variable, por ejemplo: int miNumero.
De este modo tenemos la posibilidad de indicar que la variable establecida como Ā«miNumeroĀ» siempre contendrĆ” un nĆŗmero entero; de ser otro el caso, el compilador nos lanzarĆa un mensaje de error obstaculizĆ”ndonos la posibilidad de compilar el programa que hayamos realizado.
De hecho esto tambiĆ©n puede pasarnos con los objetos, si en Java definimos la clase Ā«largometrajeĀ», conociendo estĆ” palabra como una pelĆcula cinematogrĆ”fica de duración superior a una hora, cuando creamos objetos de la clase Ā«largometrajeĀ» debemos seƱalar las variables en las que se indique el tipo de objeto que se pretende que realice. Podemos expresarlo de esta manera:
Largometraje miLargo= new Largometraje
Nuestra variable vendrĆa siendo Ā«miLargoĀ» y exponiendo esto, tendremos una referencia a un objeto de la clase o de los tipos de Ā«LargometrajeĀ», y mientras que dure siempre deberĆ” tener cualquier objeto de la misma clase o tipo, dicho esto es importante conocer entonces que no se puede guardar un entero en la variable, o algĆŗn otro objeto de otro tipo o clase, que no sea herencia y que no tenga ninguna relación.
Si volvemos a mencionar el ejemplo de los vehĆculos y sus tipos, es importante aclarar que si decidimos definir una variable que apunte hacia el objeto de clase Ā«motoĀ», mientras estĆ” variable dure, siempre deberĆ” apuntar a un objeto relacionado o de herencia a la clase Ā«motoĀ», no a la clase Ā«cocheĀ», ni Ā«busĀ»; sin embargo, en los lenguajes dĆ©bilmente tripados como los que mencionamos anteriormente, no existe esta inflexibilidad, aunque sea una caracterĆstica habitual de los lenguajes como Java que son fuertemente tripados. A continuación ofreceremos un ejemplo mĆ”s amplio:
- Coche miCoche= new Coche (Mazda 2ā³): Mazda 2 vendrĆa siendo nuestra herencia del objeto perteneciendo a esa clase o tipo, y es al que la variable apunta, y si asĆ lo quisiĆ©ramos maƱana podrĆa apuntar hacia otro objeto de miCoche.
MiCoche= new Coche (Ford Focus 2.0ā³)
Lo que nunca podremos hacer es almacenar en nuestra variable establecida como de clase Coche, otra cosa que no tenga ninguna relación con el tipo Coche, porque entonces tendrĆamos un error en tiempo de compilación, en caso de que pase, debe haber guardado New Coche Ford Focus 2.0 hubiĆ©ramos escogido New Moto Yamaha YBR.
Se debe aclarar que en este punto no estamos hablando de polimorfismo como tal aún, sino que estamos tanteando la programación en general con el sistema de tipos; el asunto es que debemos abrir nuestras mentes a las complicaciones que puede darnos la restricción de lenguajes fuertemente tripados para luego comprender porqué el polimorfismo es importante y una pieza clave en el polimorfismo en programación orientada a objetos.
En un idioma informĆ”tico totalmente tipado cuando se manifiesta una función, siempre debemos mantener como punto de importancia que al informar el tipo deĀ normas que va a recibir. A la función que hayamos establecido, no le podremos pasar como normas otra cosa que no sean variables o literales con valores de nĆŗmero entero, si se nos ocurre pasar otros datos con otros tipos el compilador se va a alterar, no nos dejarĆ” compilar el programa porque en tal caso no podrĆa encontrar los tipos esperados en los parĆ”metros de la función.
Polimorfismo en objetos
Finalmente hemos llegado a la parte que realmente puntualiza este tema de interƩs, es por ello que bajo este sistema se efectuarƔn elementos propios que manifiesten las clases y objetivos del mismo, tal cual funcionan los lenguajes fuertemente tipados, una variable siempre deberƔ apuntar a un objeto de la clase que indicamos al momento en que lo establecimos.
Eso es algo indispensable de recordar, ahora, una función cuyo parÔmetro se haya declarado de una clase, solo nos aceptarÔ recibir objetos de esa clase; un array que se haya declarado que es de elementos de un tipo determinado solo nos permitirÔ rellenar sus casillas con objetos de ese tipo que establecimos; presentaremos otro ejemplo:
VehĆculo [ ] misVehiculos= new VehĆculo [3]
Este ejemplo estamos dando, es una variable que es un array y en la misma declaramosĀ que el contenido de las casillas serĆ”n objetos de la clase VehĆculo, en lenguaje fuertemente tripado solo podrĆ” contener objetos de la clase vehĆculo, como ya habĆamos explicado, pero ahora nos encontramos con el polimorfismo, con el cual podemos darle un poco mĆ”s de flexibilidad al sistema de tipos, dĆ”ndonos la oportunidad de que una variable tambiĆ©n nos acepte objetos de la clase Ā«hijasĀ» o derivadas.
Al hacer al sistema de tipos mĆ”s flexible no estamos hablando de en su totalidad, sino con lo que tendrĆa que ver con las clasificaciones de herencia que tengamos en nuestros sistemas de clases o tipos. Si logramos definir un array usando casillas de una clase establecida, el compilador nos aceptarĆa insertar en esas casillas palabras Ā«hijasĀ» de ese objeto que ya habĆamos establecido, si establecemos que una función recibe como parĆ”metros objetos de alguna clase, el compilador nos permitirĆ” que le enviemos la invocación de objetos de una clase derivada de aquella que ya habĆamos declarado.
LlevĆ”ndolo a algo mĆ”s concreto, nuestro array de vehĆculo no solo nos permitirĆ” insertar vehĆculos genĆ©ricos a su variable, sino tambiĆ©n todos los objetos de las clases hijas o derivadas de esta clase, entonces tendrĆamos objetos de la clase bus, coche y moto o cualquier hija que hayamos definido, y todo esto gracias al polimorfismo.
Aplicando el Polimorfismo
A pesar de la explicación que le habĆamos dado a largometraje, queremos aclarar que ademĆ”s de ser una pelĆcula, podemos tambiĆ©n tener documentales, y entre otros; quizĆ” ambos tienen diferentes caracterĆsticas, distintos horarios de audiencia, distintos precios y por ello pudimos haber decidido que nuestra clase Largometraje tenga clases hijas o herencias como Ā«pelĆculaĀ» o Ā«documentalĀ».
Si creamos una clase establecida como Cine y un mĆ©todo al que llamaremos Ā«reproducirĀ», nos servirĆ” como parĆ”metro para aquello que queremos reproducir en una sala de cine, donde podrĆ”n llegamos objetos tanto de la clase cine como de la clase documental, si comprendemos bien el sistema de tipos (sin aun entrar en polimorfismo) nuestros mĆ©todos van a establecer los tipos de los parĆ”metros que recibimos. Se verĆa algo como esto:
-
Reproducir (PelĆcula pelĆculaParaReproducir)
Pero en cambio si queremos reproducir un documental tendrĆamos que cambiar nuestra fórmula.
-
Reproducir (Documental documentalParaReproducir)
ĀæY es realmente necesario crear dos fórmulas distintas? Ambos mĆ©todos para reproducir las dos cosas serĆan exactamente los mismos, ĀæPor quĆ© molestarse? Solo tendrĆamos que poner el largometraje en el reproductor, darle a reproducir (o play) y crear un registro con la cantidad de entradas que lograron ser vendidas. Aunque no nos suponga una molestia hacer ambos mĆ©todos, debemos estar conscientes de que se nos puede presentar la situación en la que tengamos que crear otra fórmula, podrĆamos poner el ejemplo de que tengamos una pelĆcula, pero esta vez en formato 3D.
Ya llegados a este punto, podemos recurrir al polimorfismo, con su ayuda podremos crear un mĆ©todo de reproducir que nos reconocerĆ” todo tipo de elementos, documentales, pelĆculas o cualquier otra cosa de la misma clase (que tenga relación), que necesitemos crear en el futuro. Lo que nos estarĆan permitiendo los lenguajes, es establecer el mĆ©todo reproducir indicando que el parĆ”metro de la clase que vamos a recibir es un objeto de tipo largometraje, pero el lenguaje y el compilador nos estarĆan aceptando cualquier objeto derivado de pelĆcula o documental, quedarĆamos con algo como esto: reproducir (Largometraje elementoParaReproducir).
Ya sea que queramos crear pelĆculas o documentales para reproducirlos, todo esto serĆ” posible con un solo mĆ©todo, el de reproducir, gracias a que por el polimorfismo en programación orientada a objetos flexibilizamos el sistema, no harĆ” falta. Por ejemplo, si quieres reproducir una pelĆcula y no un documental, no nos veremos en la necesidad de seleccionar la clase Cine, sino que solo basta con que lo que queramos reproducir forme parte de la herencia del objeto largometraje.
Si nos regresamos al ejemplo del vehĆculo, aun teniendo en mente la utilidad del polimorfismo y las posibilidades que nos brinda para reducir todo el mantenimiento de los programas informĆ”ticos que tendrĆamos que hacer de no tener la ayuda de este concepto.
Digamos que tenemos la clase Parking (en espaƱol seria la clase para aprender a estacionar) dentro de la que tenemos la función de estacionar. En un estacionamiento tenemos la posibilidad de estacionar autobuses y motos, ademĆ”s de solamente coches, y sin polimorfismo tendrĆamos que crear un mĆ©todo que nos permita estacionar objetos de tipo Ā«cocheĀ» y otro que nos permita estacionar objetos de tipo Ā«autobĆŗsĀ» y otro que nos permita estacionar objetos de tipo Ā«motoĀ», aunque el procedimiento para realizar estas acciones a pesar de la notable diferencia entre las apariencias de estos tres vehĆculos es bĆ”sicamente la misma, solo que uno ocupa mĆ”s espacio que el otro.
Lo mĆ”s preciso serĆa tener un solo mĆ©todo que nos simplifique las cosas y nos permita recibir todo tipo de vehĆculos, no solo coches y marca de coches, sino todos los derivados aceptados y preciosos del objeto vehĆculo. Primero tendrĆamos la reutilización del código, porque como ya habĆamos dicho, estacionar esos tipos de vehĆculos es parecido con la Ćŗnica diferencia del espacio que ocupa cada uno, pero ademĆ”s de esto, si maƱana saliese a la venta en el mercado algĆŗn otro tipo de vehĆculo, tendrĆamos la posibilidad de que nuestro software sea capaz de aceptarlo sin ninguna necesidad de modificar nuestra clase ya establecida Parking.
Tenemos a la disposición de un solo mĆ©todo la aceptación de todas las herencias precisas que pueda tener vehĆculo, flexibilizando el trabajo y ahorrĆ”ndonos el tiempo que nos habrĆamos gastado creando uno para cada tipo de vehĆculo. El polimorfismo en programación orientada a objetos nos abre las puertas a una gama de objetos que pueden ser aceptadas por un solo mĆ©todo.
Intentamos explicar de la manera mĆ”s comprensible el polimorfismo y hacer una revisión amplia de todo lo que hay detrĆ”s del mismo, no habrĆa sido adecuado saltar de una vez al concepto como tal sin proveer sus antecedentes para ayudarnos a entenderlo y a entender su resaltante importancia y el uso que podemos darle.
Tener la posibilidad de poder englobar varios mĆ©todos en uno solo, mientras las derivaciones concuerden como herencia del objeto, es bastante Ćŗtil porque nos ahorra la necesidad de tener que crear varios obligĆ”ndonos a ser muy especĆficos sin darnos la posibilidad de hacer un trabajo mĆ”s flexible en el que podamos crear una manera mĆ”s dinĆ”mica de manejar lo que hayamos programado, tan simple como saber la derivación correcta de una sola palabra, es decir, todo lo que engloba, nos ayuda a hacer un trabajo mĆ”s eficaz.
Esperamos disfrutarĆ”s este artĆculo y aprendieras que es el polimorfismo en programación orientada a objetos. Si deseas leer otro de nuestros artĆculos sobre programación, te recomendamos visitar el siguiente que nos brinda una forma de programación muy conocida en el mundo de la informĆ”tica: Programación C++.

