Polimorfismo en Programación Orientada a Objetos

  • Por
Qué es el polimorfismo en la Programación Orientada a Objetos, el motivo de su existencia y cómo implementar polimorfismo en clases y objetos.

El concepto de polimorfismo es en realidad algo muy básico. Realmente, cuando estamos aprendiendo Programación Orientada a Objetos (también conocida por sus siglas POO / OOP) muchos estudiantes nos hacemos un embolado tremendo al tratar de entender el concepto, pero en su base es algo extremadamente sencillo.

Trataremos de explicarlo en este artículo con palabras sencillas, pero para los valientes, aquí va una primera definición que no es mía y que carece de la prometida sencillez. Pero no te preocupes, pues la entiendas o no, luego lo explicaré todo de manera más llana.

Definición: El polimorfismo es una relajación del sistema de tipos, de tal manera que una referencia a una clase (atributo, parámetro o declaración local o elemento de un vector) acepta direcciones de objetos de dicha clase y de sus clases derivadas (hijas, nietas, …).

Nota: Esta es la definición académica que nos ofrece el profesor de la UPM Luis Fernández, del que fui alumno en la universidad y en EscuelaIT.

Herencia y las clasificaciones en Programación Orientada a Objetos

Para poder entender este concepto de OOP necesitas entender otras cosas previas, como es el caso de la herencia. Esto lo hemos explicado en un artículo anterior en DesarrolloWeb.com: Herencia en la Programación Orientada a Objetos.

Veremos que el polimorfismo y la herencia son dos conceptos estrechamente ligados. Conseguimos implementar polimorfismo en jerarquías de clasificación que se dan a través de la herencia. Por ejemplo, tenemos una clase vehículo y de ella dependen varias clases hijas como coche, moto, autobús, etc.

Pero antes de entender todo esto, queremos ir un poco más hacia atrás, entendiendo lo que es un sistema de tipos.

Por qué el sistema de tipos es importante en Polimorfismo

Muchos de los lectores que asumo se introducen en el concepto de polimorfismo a través de este artículo han aprendido a programar en lenguajes débilmente tipados, como es el caso de PHP y Javascript. Por ello es conveniente entender cómo es un lenguaje fuertemente tipado, como es el caso de Java o C.

En estos lenguajes, cuando defino una variable, siempre tengo que decir el tipo de datos que va a contener esta variable. Por ejemplo:

int miNumero;

Así le indicamos que la variable declarada "miNumero" va a contener siempre un entero. Podrás asignarle diversos valores, pero siempre deben de ser números enteros. De lo contrario el compilador te lanzará un mensaje de error y no te permitirá compilar el programa que has realizado.

Esto incluso pasa con los objetos. Por ejemplo, si en Java defino la clase "Largometraje" (una cinta que se puede exhibir en la televisión o el cine), cuando creo objetos de la clase "Largometraje" debo declarar variables en las que indique el tipo de objeto que va a contener.

Largometraje miLargo = new Largometraje("Lo que el viento se llevó");

Esa variable "miLargo", por declaración tendrá una referencia a un objeto de la clase "Largometraje". Pues bien, durante toda su vida, deberá tener siempre una referencia a cualquier objeto de la misma clase. O sea, mañana no podremos guardar un entero en la variable, ni una cadena u otro objeto de otra clase.

Volviendo al ejemplo de los vehículos, si defino una variable que apunta a un objeto de clase "Coche", durante toda la vida de esa variable tendrá que contener un objeto de la clase Coche, no pudiendo más adelante apuntar a un objeto de la clase Moto o de la clase Bus. Esta rigidez, como decimos, no existe en los lenguajes débilmente tipados como es el caso de Javascript o PHP, sin embargo es una característica habitual de lenguajes como Java, que son fuertemente tipados.

Coche miCoche = new Coche("Ford Focus 2.0");
//la variable miCoche apunta a un objeto de la clase coche
//si lo deseo, mañana podrá apuntar a otro objeto diferente, pero siempre tendrá que ser de la clase Coche
miCoche = new Coche("Renault Megane 1.6");

Lo que nunca podré hacer es guardar en esa variable, declarada como tipo Coche, otra cosa que no sea un objeto de la clase Coche.

//si miCoche fue declarada como tipo Coche, no puedo guardar un objeto de la clase Moto
miCoche = new Moto("Yamaha YBR");
//la línea anterior nos daría un error en tiempo de compilación

Fíjate que en este punto no te estoy hablando todavía de polimorfismo, sino de algo de la programación en general como es el sistema de tipos. Sin embargo, tienes que amoldar la cabeza a esta restricción de lenguajes fuertemente tipados para que luego puedas entender por qué el polimorfismo es importante y clave en la programación orientada a objetos. Y ojo, insisto que esto es algo relacionado con lenguajes fuertemente tipados (también llamados de tipado estático), en PHP no habría problema en cambiar el tipo de una variable, asignando cualquier otra cosa, dado que no se declaran los tipos al crear las variables.

Entendida esa premisa, pensemos en el concepto de función y su uso en lenguajes de tipado estático.

Nota: A veces, a los lenguajes fuertemente tipados se les llama de "tipado estático" y a los débilmente tipados se les llama "tipado dinámico". Si quieres saber más sobre lenguajes tipados y no tipados, te recomiendo ver el #programadorIO tipados Vs no tipados.

Cuando en un lenguaje fuertemente tipado declaramos una función, siempre tenemos que informar el tipo de los parámetros que va a recibir. Por ejemplo, la función "sumaDosNumeros()" recibirá dos parámetros, que podrán ser de tipo entero.

function sumaDosNumeros(int num1, int num2)

A esta función, tal como está declarada, no le podremos pasar como parámetros otra cosa que no sean variables -o literales- con valores de número entero. En caso de pasar otros datos con otros tipos, el compilador te alertará. Osea, si intentas invocar sumaDosNumeros("algo", "otro"), el compilador no te dejará compilar el programa porque no ha encontrado los tipos esperados en los parámetros de la función.

Esto mismo de los parámetros en las funciones te ocurre también con los atributos de las clases, cuyos tipos también se declaran, con los datos que se insertan en un array, etc. Como ves, en estos lenguajes como Java el tipado se lleva a todas partes.

Polimorfismo en objetos

Ahora párate a pensar en clases y objetos. Quédate con esto: Tal como funcionan los lenguajes fuertemente tipados, una variable siempre deberá apuntar a un objeto de la clase que se indicó en el momento de su declaración. Una función cuyo parámetro se haya declarado de una clase, sólo te aceptará recibir objetos de esa clase. Un array que se ha declarado que es de elementos de una clase determinada, solo aceptará que rellenemos sus casillas con objetos de esa clase declarada.

Vehiculo[] misVehiculos = new Vehiculo[3];

Esa variable misVehiculos es un array y en ella he declarado que el contenido de las casillas serán objetos de la clase "Vehiculo". Como se ha explicado, en lenguajes fuertemente tipados sólo podría contener objetos de la clase Vehiculo. Pues bien, polimorfismo es el mecanismo por el cual podemos "relajar el sistema de tipos", de modo que nos acepte también objetos de las clases hijas o derivadas.

Por tanto, la "relajación" del sistema de tipos no es total, sino que tiene que ver con las clasificaciones de herencia que tengas en tus sistemas de clases. Si defines un array con casillas de una determinada clase, el compilador también te aceptará que metas en esas casillas objetos de una clase hija de la que fue declarada. Si declaras que una función recibe como parámetros objetos de una determinada clase, el compilador también te aceptará que le envíes en la invocación objetos de una clase derivada de aquella que fue declarada.

En concreto, en nuestro array de vehículos, gracias al polimorfismo podrás contener en los elementos del array no solo vehículos genéricos, sino también todos los objetos de clases hijas o derivadas de la clase "Vehiculo", osea objetos de la clase "Coche", "Moto", "Bus" o cualquier hija que se haya definido.

Para qué nos sirve en la práctica el polimorfismo

Volvamos a la clase "Largometraje" y ahora pensemos en la clase "Cine". En un cine se reproducen largometrajes. Puedes, no obstante, tener varios tipos de largometrajes, como películas o documentales, etc. Quizás las películas y documentales tienen diferentes características, distintos horarios de audiencia, distintos precios para los espectadores y por ello has decidido que tu clase "Largometraje" tenga clases hijas o derivadas como "Película" y "Documental".

Imagina que en tu clase "Cine" creas un método que se llama "reproducir()". Este método podrá recibir como parámetro aquello que quieres emitir en una sala de cine y podrán llegarte a veces objetos de la clase "Película" y otras veces objetos de la clase "Documental". Si has entendido el sistema de tipos, y sin entrar todavía en polimorfismo, debido a que los métodos declaran los tipos de los parámetros que recibes, tendrás que hacer algo como esto:

reproducir(Pelicula peliculaParaReproducir)

Pero si luego tienes que reproducir documentales, tendrás que declarar:

reproducir(Documental documentaParaReproducir)

Probablemente el código de ambos métodos sea exactamente el mismo. Poner la película en el proyector, darle al play, crear un registro con el número de entradas vendidas, parar la cinta cuando llega al final, etc. ¿Realmente es necesario hacer dos métodos? De acuerdo, igual no te supone tanto problema, ¿pero si mañana te mandan otro tipo de cinta a reproducir, como la grabación de la final del mundial de fútbol en 3D? ¿Tendrás que crear un nuevo método reproducir() sobre la clase "Cine" que te acepte ese tipo de emisión? ¿es posible ahorrarnos todo ese mantenimiento?

Aquí es donde el polimorfismo nos ayuda. Podrías crear perfectamente un método "reproducir()" que recibe un largometraje y donde podrás recibir todo tipo de elementos, películas, documentales y cualquier otra cosa similar que sea creada en el futuro.

Entonces lo que te permiten hacer los lenguajes es declarar el método "reproducir()" indicando que el parámetro que vas a recibir es un objeto de la clase padre "Largometraje", pero donde realmente el lenguaje y compilador te aceptan cualquier objeto de la clase hija o derivada, "Película", "Documental", etc.

reproducir(Largometraje elementoParaReproducir)

Podremos crear películas y reproducirlas, también crear documentales para luego reproducir y lo bonito de la historia es que todos estos objetos son aceptados por el método "reproducir()", gracias a la relajación del sistema de tipos. Incluso, si mañana quieres reproducir otro tipo de cinta, no tendrás que tocar la clase "Cine" y el método "reproducir()". Siempre que aquello que quieras reproducir sea de la clase "Largometraje" o una clase hija, el método te lo aceptará.

Pongamos otro ejemplo por si acaso no ha quedado claro con lo visto hasta el momento, volviendo de nuevo a la clase Vehiculo. Además nos centramos en la utilidad del polimorfismo y sus posibilidades para reducir el mantenimiento de los programas informáticos, que es lo que realmente me gustaría que se entienda.

Tenemos la clase Parking. Dentro de ésta tenemos un método estacionar(). Puede que en un parking tenga que estacionar coches, motos o autobuses. Sin polimorfismo tendría que crear un método que permitiese estacionar objetos de la clase "Coche", otro método que acepte objetos de la clase "Moto" para estacionarlos, etc. Pero todos estaremos de acuerdo que estacionar un coche, una moto o un bus es bastante similar: "entrar en el parking, recoger el ticket de entrara, buscar una plaza, situar el vehículo dentro de esa plaza...".

Lo ideal sería que nuestro método me permita permita recibir todo tipo de vehículos para estacionarlos, primero por reutilización del código, ya que es muy parecido estacionar uno u otro vehículo, pero además porque así si mañana el mercado trae otro tipo de vehículos, como una van, todoterreno hibrido, o una nave espacial, mi software sea capaz de aceptarlos sin tener que modificar la clase Parking.

Gracias al polimorfismo, cuando declaro la función estacionar() puedo decir que recibe como parámetro un objeto de la clase "Vehiculo" y el compilador me aceptará no solamente vehículos genéricos, sino todos aquellos objetos que hayamos creado que hereden de la clase Vehículo, osea, coches, motos, buses, etc. Esa relajación del sistema de tipos para aceptar una gama de objetos diferente es lo que llamamos polimorfismo.

En fin, esto es lo que significa polimorfismo. A partir de aquí puede haber otra serie de consideraciones y recomendaciones, así como características implementadas en otros lenguajes, pero explicar todo eso no es el objetivo de este artículo. Esperamos que con lo que has aprendido puedas orientar mejor tus estudios de Programación Orientada a Objetos. Si quieres más información sobre el tema lee el artículo Qué es Programación Orientada a Objetos, que seguro te será de gran utilidad.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Schatten des Todes

20/5/2014
Polimorfismo
Tienes algún ejemplo?

Es decir, si le paso la misma clase, hago referencia a los atributos como documental, futbol, etc. en el codigo

Ariel Ferro

21/5/2014
polimorfismo
Excelente post. Muy facil de entender un tema no muy fácil de explicar...

MFC

09/7/2014
No entendi muy bien.
No entendi muy bien. Es posible que muestres un ejemplo con codigos concretos?. Se crea confusión entre quienes y como son y estan conectadas las clases padres e hijas.

Zumo

10/7/2014
No lo pillé del todo
En la universidad me dijeron que el polimorfismo es que un objeto puede tener varias formas, como la clase "transporte" que puede tener objetos como auto, tren, caballo, barco.

Creo que seria mejor hacer un vídeo de programación explicando esto de forma practica. La única manera de entenderlo bien seria así.

luis

24/7/2014
no está bien explicado
el asunto en cuestión solo se menciona una sola vez y lo único que dice es que se instancia la clase padre para no reescribir un nuevo método para dos subclases pelicula y documental.
Saludos.

midesweb

01/8/2014
Mejoré el artículo...
He explicado un poco más detalladamente el polimorfismo, incluido nuevos ejemplos, definiciones más generales, imágenes, etc. Espero que ahora mejore para las personas que teníais dificultades en entenderlo.

Xavi

03/8/2014
Confusión común tipado fuerte/débil vs estático/dinámico
Buenas,
Un lenguaje de tipado fuerte no es equivalente a un lenguaje de tipado estático. Para eso hago una rápida explicación:
1) Un lenguaje es de tipado dinámico cuando los tipos de las variables se resuelven en tiempo de ejecución y es de tipado estático cuando los tipos de las variables se resuelven en tiempo de compilación.
2) Un lenguaje es de tipado fuerte cuando sus variables pueden asignarse a otras del mismo tipo, o a diferente tipo con una conversión explícita. Son débiles si no.
Para poner un ejemplo de que fuerte y estático y d´ebil y dinámico no van a la par, pondré el ejemplo de C. C es un lenguaje de tipado estático y débilmente tipado. Pues el compilador es el que resuelve el tipo de las variables asignando el espacio correspondiente que ocuparán. Sin embargo es de tipado débil pues permite la conversión implícita entre variables double e int, punteros de diferentes tipos (int*, void*, struct miEstructura*)

http://stackoverflow.com/questions/2351190/static-dynamic-vs-strong-weak
Un saludo!

Eliana

06/10/2014
Agradecimiento
Exelente!!!!!!
Muchas gracias por la información, muy bien explicado, y de gran ayuda.
Creo que con mayor conocimiento en programación es más fácil entenderlo,
Pero muy bien explicado, se entiende claramente lo escencial del funcionamiento del polimorfismo.

Saludos.

Carlos Pereira

25/10/2014
Simple y objetivo
Excelente explicación, muy eficiente, simple y objetivo... los ejemplos que expuestos son claros. Muchas gracias!!

Francisco

31/10/2014
Muy buen post!
Muy buena explicación. Muchas gracias, me sirvio mucho. Exitos y saludos!

Luis

02/11/2014
LA MEJOR EXPLICACIÓN DE POLIMORFISMO DE TODA LA RED
He revisado varias páginas donde intentaban explicar el concepto de POLIMORFISMO y en ninguna de ellas se explicaba ni la mitad de claro que aquí. Genial el artículo. Gracias por compartir

Romualdo

27/11/2014
Polimorfismo no es solo debilitar el sistema de tipos
Algo me dice que esta definicion no esta completa, lo que decis no tiene discucion eh, pero el polimorfismo no es solo debilitar el sistema de tipos, mirad un ejemplo de wikipedia

ejemplo empieza aqui...
Podemos crear dos clases distintas: Pez y Ave que heredan de la superclaseAnimal. 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 Pezy Ave por medio de una variable de referencia de clase Animal, haciendo así un uso polimórfico de dichos objetos respecto del mensaje mover.

en conclusion el polimorfismo no puede ser solo debilitar el sistema de tipos...

romualdo

27/11/2014
Me he equivocado
Ya comprendo que el polimorfismo si podria definirse como un metodo de debilitar el sistema de tipos, primero debemos comprender como explican aqui en esta entrada que polimorfismo significa multiples-formas, y en java al igual que muchos otros lengujaes orientados a objetos eso significa que los objetos pueden tomar la forma de otros objetos o el lugar de objetos de otro tipo esto permite que nuestro codigo pueda ser mas generico, por ejemplo imaginad la clase Animal, ahora imaginad la clase Gato que hereda de animal, bien entonces creamos una funcion independiente que recibe como parametro un objeto de tipo Animal, nosotros en lugar de pasarle a este metodo una instancia de la clase Animal podriamos pasarle una instancia de la clase Gato pues al ser Gato una clase que hereda de Animal podemos decir que Gato posee todas las funcionalidades y caracterisiticas de la clase Animal por tanto a nuestra funcion independiente le da lo mismo trabajar con Gato o con Animal pues ambas deberian poseer las mismas caracteristicas esenciales que nuestra funcion independiente necesita para trabajar....
En conclusion: la definicion de este articulo si abarca todo el concepto.....

jaime

17/12/2014
Invertir polimorfismo
Hola, muy bueno el post, pero ahora tengo una duda que no se como resolver. voy a poner un ejemplo con código para que se vea mejor. supongamos que tenemos la clase Vehiculo, de la cual heredan Coche, Moto, Autobus. Ahora bien, tengo un arreglo de vehiculos, pero me hace falta saber el tipo de vehiculo que hay en el arreglo. La idea sería crear en la clase Vehiculo un método Tipo y que este devuelva el tipo de objeto de esa clase, pero sin tener que sobreescribir el método en cada clase hija, voy con el ejemplo:
Normalmente se haría así:
class Vehiculo
{
...
function Tipo
{
return "Vehiculo";
}
}

class Coche extends Vehiculo
{
...
function Tipo
{
return "Coche";
}
}

class Moto extends Vehiculo
{
...
function Tipo
{
return "Moto";
}
}


Ahora bien, en cada clase hija tenemos que sobreescribir el metodo "Tipo". Lo que necesito es siguiente:
Crear en la clase padre un metodo lo sufientemente generico para que devuelva el nombre de las clases hijas pero sin tener que sobreescribir el metodo en cada clase hija, en el codigo sería algo como lo siguiente, pero que no me pincha, para todas las hijas me dice q son Vehiculos, y lo que me hace falta que me diga si son Motor, Coche, etc.
class Vehiculo
{
...
function Tipo
{
return __CLASS__;
}
}

Por favor si alguien sabe como puedo hacer esto se lo agradesco mucho.

Gracias.

Joan Sebastian Hernandez Ladino

18/12/2014
Saludos
Gracias excelente aporte, en ocasiones intentan un concepto demasiado complejo sobre lo que es polimorfismo lo cual lo enreda un poco a uno, pero con tu manera de explicar simple y sencilla se entiende perfectamente gracias :)

jaime

26/12/2014
Genericidad
Buenas a todo. Primero que todo Feliz Navidad y próspero año nuevo. Estoy implementando el patron Repositorio y necesito hacer una clase genérica, el pbl es que soy nuevo con php y no se como hacerlo, en c# sería:
class BaseRepository<T>
{
...
function Add(T item)
{
//codigo para agregar el nuevo elemento a la BD
}
}

class UserRepository : BaseRepository<User>
{...}

Por favor si alguien sabe cómo hacerlo o en que sitio puedo saber donde está, se lo agradesco.

Graziella

26/1/2015
felicitaciones!!
Excelente explicación. Ahora sí me quedó clarísimo lo que es el Polimorfismo y en qué nos ayuda.

Andres

03/2/2015
Respuesta
Respecto a que el polimorfismo no se utilice en la practica, creo que esta mal decirlo, en lo personal lo uso y mucho. Respecto a esta parte reproducir(Pelicula peliculaParaReproducir)

Pero si luego tienes que reproducir documentales, tendrás que declarar:

reproducir(Documental documentaParaReproducir)
no creo que sea necesario hacer una declaracion a cada cosa si lo que pasar es un objeto, para eso existe la sobrecarga de metodos y, ademas, sabiendo que el polimorfismo solo existe con la herencia, queda de sobra decir que desde las clases hijas se puede llamar a un metodo que solo exista en la clase padre como si fuera de estas.

Homero J simpsons

12/3/2015
No entendi
Yo no entendi bien la pelicula, sabia la policia que asuntos internos le tendia una trampa?

tupapi

23/3/2015
Buen articulo
Muy buen articulo amewo, me fue de gran utilidad para mi examen.

salu2 pelu2 cali2

Adrian Castillo

27/4/2015
Excelente
Muy bien explicado.

Maria Mussaffi

30/4/2015
Opinión sobre el artículo
Excelente, explicado de una manera muy clara, me saco de dudas

Juan Casirola

20/6/2015
Excelente!!
Llevo un tiempo programando Java y usando el polimorfismo (sin saber) y este post me ha dejado claro el concepto.

Saludos!

Salvador González

27/6/2015
Polimórficos
Para hacer un array de objetos polimórficos en PHP no necesitas jugar con clases abstractas, eso entra en la definición de polimorfismo?

Francisco

12/7/2015
Me aclaraste mucho
Creo q ahora por fin entendí el polimorfismo. Gracias

Said Halloun

16/7/2015
Gracias por tu ayuda
excelente explicación , me gusta tu manera de enseñar, aprendí bien lo que polimorfismo, mi POO es débil y estoy reforzando conocimientos.

leoyulitta

05/8/2015
Polimorfismo aclarado
Hola amigo te escribo desde Argentina para decirte que es la primera vez que entiendo el significado de polimorfismo en poo y todo gracias a tu explicación, Te agradezco todo lo que haces por la programación. Saludos desde Argentina.

Esteban

10/8/2015
Muy buen artículo
Viejo, muchas gracias por enseñarnos lo que en muchas parte ponen como un concepto difícil. con ejemplos comunes simplemente queda muy claro. Gracias, esa es la escencia del arte de enseñar

Gabriel

28/8/2015
Mi opinion
Entendí perfectamente, muy bien explicado. Al comienzo puede parecer demasiado introductorio pero luego se aclara todo muy fácilmente. Muchas gracias.

Joan Josep

02/10/2015
Diferencias entre Java y .NET?
Hola! Excelente post, aunque me gustaría saber qué diferencias hay entre el polimorfismo en Java y en .Net. Vendría a ser lo mismo, o hay algún concepto que diste bastante?

Jurek

28/10/2015
Excelente
muy buen artículo, el que no entendió, pues déjeme decirles que mejor estudien una carrera técnica, un buen ing y analista lo entiende muy rápido.

Sofia

10/11/2015
me leí 3 veces el artículo de wikipedia y 1 vez este
Estaba apurada para saber lo que era el polimorfismo. en clase con nuestro profesor es imposible pillar nada y necesitaba aclararme para ir al examen. Me leí tres veces el texto completo de la wikipedia. Mucho experto pero pocas dotes docentes. Contigo lo he podido entender a la primera y creo que incluso podría explicarlo a mis compañeros de clase. Gracias por todo.

Mercedes

11/11/2015
Demasiado largo complejo para lo sencillo que es
En el artículo se explica todo muy bien, pero no se sintetiza y se alarga demasiado las explicaciones con frases redundantes y ideas sobradamente repetidas que hacen pesado el artículo. El artículo podría ser igual de aclarador y útil siendo más conciso.
Es solo un sugerencia, aunque agardezco el esfuerdo del escritor.

Un saludo.

jose Castillo

21/11/2015
Polimorfismo
Que buen articulo, estoy tratando de aprender y entender la POO y estas clases de analogias y explicaciones me han ayudado bastante, gracias.

Santiago

16/3/2016
Me ha servido mucho
Miguel, termino de leer el articulo y me ha ayudado mucho
si bien el tema no me representaba tantos inconvenientes termine reforzando los conceptos de polimorfismo gracias a esta gran explicación.
Este es el primer articulo que leo, y gracias a él continuare leyendo los siguientes
muchas gracias

@master_mintaka

21/4/2016
Excelente post
Siendo la parte conceptual de la POO un poco compleja de entender, creo que la forma como se construye éste artículo permite a los lectores entender el concepto, el uso de los ejemplos es impecable y el uso en la vida real del concepto teórico dejan sin lugar a duda perfectamente claro el concepto y la funcionalidad del polimorfismo en la Programación Orientada a Objetos.
Felicitaciones.

Jorgemarquez17

05/5/2016
Exelente
muy buena explicacion para reforzar conocimientos de POO
mas claro que el agua

Rene C

14/5/2016
directo y objetivo
Me sirvio como material de apoyo en la parte de algunos conceptos

Alice

27/5/2016
Resp
Muy buena explicación, se entendió!

ezequiel

29/6/2016
agradecer por la explicacion
Una forma facil de entender el polimorfismo , gracias por la explicacion : )

Pazc

25/7/2016
Muy buena explicación
Yo estoy estudiando Java y en el libro que tengo se me hizo complicado entender el polimorfismo, ahora con tu explicación ya me di cuenta hacia dónde va todo . Gracias por la explicación

np

01/9/2016
Explicacion mala de conceptos
No explicas lo que dice en el titulo >:v

Pame

22/9/2016
Excelente
Muy bien explicado, gracias!!!!!

Monzerrat Richa

14/11/2016
Excelente!
Me sirvió mucho! Muchas gracias!

Hernando

09/12/2016
Muy buen aporte.
Excelente. Me ayudó mucho a aclarar el tema.
Mil gracias.