top of page

Polimorfismo: El viejo desconocido.

Foto del escritor: Federico MachadoFederico Machado

Cuando me toca entrevistar gente para Java Senior, una de las preguntas que más me gusta hacer para romper el hielo es: ¿Qué es el polimorfismo? Siento que es un concepto que muchos tienen por asumido que entienden y conocen, pero a la hora de la verdad me ha sorprendido escuchar como gente con muchos años de experiencia, flaquea al contestar esta pregunta de un concepto que me parece un pilar fundamental de la programación orientada a objetos. ¿Sabías que por ejemplo, hay dos tipos de polimorfismo? Dependiendo de dónde vengas y cómo te hayas instruido, es posible que respondas a esta pregunta de manera diferente.


La primera definición se refiere al polimorfismo estático, que trata del comportamiento en tiempo de compilación a la hora de definir métodos, en función de los parámetros de estos. Es también a veces definido como sobrecarga de métodos. Todos los métodos tienen el mismo nombre pero tienen diferentes tipos de parámetros o diferentes cantidades de parámetros. Un ejemplo clásico de este comportamiento es un método sumar(int x, int y) y un método sumar(double x, double y).


La otra definición es aquella del polimorfismo dinámico, y es a la que apunto que respondan en las entrevistas. Se trata de una manera de redefinir comportamientos a través de herencia para ahorrar código y mantenerlo lo más desacoplado posible. Otro de los ejemplos clásicos que trata de explicar este concepto es el tener una clase FiguraGeométrica, con un método que se llame public abstract int calcularArea(). Que deberá ser implementado por quienes extiendan esta clase. Es de este modo que en la clase triángulo tenemos public int calcularArea() que devuelve la base por la altura dividido dos, y en la clase rectángulo tenemos que este método devuelve la base por la altura. Si estamos recorriendo una lista de FiguraGeómetrica, a la hora de llamar el calcularArea(), se llamará al método de la clase concreta (Ya sea triángulo o rectángulo) con la implementación que definimos. Este concepto nos ayuda mucho a mejorar el desacoplamiento y la modificabilidad del código, ya que si en el futuro quiero agregar una nueva figura geométrica, no voy a tener que agregar ifs para que dependiendo de la clase que agrego, haga una cosa u otra, si no que todo se va a ejecutar polimórficamente en función de la clase concreta.


Generalmente si en nuestro código tenemos un switch o varios ifs preguntando si nuestra variable es una instancia de cierta clase (Utilizando por ejemplo instanceof) , quizás deberíamos replantearnos nuestra solución para utilizar polimorfismo dinámico. ¿Les ha pasado que han tenido que usar polimorfismo para hacer más manejable el código?


 
 
 

Comments


bottom of page