04. POO: polimorfismo

Publicado por

Una vez que ya entendemos cómo interactúan los objetos podemos indagar sobre algunas otras características referentes a su comportamiento. Es importante recordar la manera en que representamos dicho comportamiento en las clases: los métodos, así como la forma en que algunos de estos métodos sirven de interfaz para la comunicación con el exterior. Es especialmente necesario recordar también la idea de la herencia entre clases. Estos temas podemos repasarlos en la nota anterior.

¿Qué es el polimorfismo?

El polimorfismo es una de las cualidades más importantes de la POO ya que representa una enorme herramienta para construir todo tipo de programas de una manera más limpia y natural.

La palabra polimorfismo se compone de dos raíces griegas: poli, que significa muchos  y morfo, que significa forma. Literalmente significa muchas formas. El polimorfismo está relacionado con el comportamiento de los objetos, por lo que podemos definir que un objeto polimorfo es aquel que tiene varias formas de comportarse o, más específicamente, varias maneras de hacer las cosas.

Los objetos pueden manifestar esta cualidad de dos maneras distintas, una directamente con su comportamiento (sus métodos) y otra usando la relación de herencia.

Respuestas a la medida

Como primer tipo de polimorfismo, los objetos pueden tener un comportamiento diferente ante distintos mensajes, es decir, pueden realizar la misma acción pero de distinta forma según la interacción que tenga con el exterior (otros objetos). Por ejemplo: a un niño podemos darle una pelota y pedirle que juegue con ella, posiblemente la patee o la bote contra el suelo; después al mismo niño podemos darle un carrito y pedirle nuevamente que juegue, en esta ocasión es más probable que tome el carrito y lo empuje haciendo sonidos de motor andando. Como sea que lo haga, el niño hace lo mismo en ambas ocasiones: juega. Sin embargo, la manera de jugar es distinta porque se le ha dado un juguete distinto cada vez.

Esta cualidad se puede implementar en la  definición de la clase de los objetos, con una técnica llamada sobrecarga de métodos, la idea es tener varios métodos que se llamen igual pero reciban un número y/o tipo distinto de parámetros, para que al momento de comunicarse con un objeto de esa clase y pedirle que realice esa acción, este pueda responder de la manera correcta según los datos que se le entregan.

Este tipo de polimorfismo es más evidente a la hora de programar, en el futuro podremos revisar algunos códigos de ejemplo para poder apreciarlo mejor.

Explotando el potencial de la herencia

El segundo tipo de polimorfismo es más complejo y poderoso, para lograrlo es importante que podamos generar buenas jerarquías de clases utilizando la herencia entre ellas. Cuando hacemos clases derivadas, estas heredan algunas propiedades de sus clases base, ya sean atributos o métodos, que podrán usar con o sin modificaciones propias. Cuando se hacen modificaciones al comportamiento heredado se dice que se realiza sobreescritura de métodos, al hacerlo se crea una manera diferente de realizar el mismo método; un objeto de la clase hija hace lo mismo que uno de la clase padre, pero de una forma diferente, y eso ya suena a polimorfismo; sin embargo, no hay manera de aplicarlo aún como en el primer tipo, para ello necesitamos encargarnos de otras tareas antes. Para explotar el polimorfismo a través de la sobreescritura, se necesita invocar el método desde el objeto padre o alguno de sus objetos hijo. La herencia otorga la identidad del objeto padre al hijo, así que un objeto de la clase hija es un objeto de la clase padre también, porque de ahí proviene. Tomemos como ejemplo una clase Animal como clase padre, una clase Carnívoro como una hija y por último una clase Herbívoro como otra hija. Tanto los carnívoros como los herbívoros son animales y poseen el mismo comportamiento básico de un animal, aunque no sea idéntico. Podemos tener un grupo conformado por animales (carnívoros y herbívoros) y sin problemas pedirle a cualquiera de ellos que se alimente, sin embargo, que sepa como cazar o buscar pastizales dependerá de si ese Animal es un Carnívoro o un Herbívoro.

Creado para ser padre

Posiblemente surja la duda de cómo se comportaría una instancia de (la clase) Animal, pues no lo sabemos, por lo menos en el ejemplo anterior no se tiene contemplado incluir en el grupo instancias de la clase padre (Animal) porque no hemos declarado cómo se alimenta un animal en general, sabemos que debe obtener energía de alguna forma, pero nada más, el resto lo dejamos definido en las clases hijas. Aunque está la posibilidad de incluir objetos de la clase padre, no siempre es necesario hacerlo, de hecho hay clases que se crean exclusivamente para hacer herencia y a veces ni siquiera tienen algo definido en sus métodos, solo basta con tenerlos para que las clases hijas los sobreescriban; en estos casos la clase padre es una clase abstracta. Las clases abstractas no pueden ser instanciadas, es decir, no podemos crear objetos de ellas y solamente nos sirven para otorgar la identidad a sus clases herederas y lograr el polimorfismo.

Conclusiones

Definitivamente el polimorfismo es una característica poderosa de la POO y todo buen programador de este paradigma sabe aprovecharlo. Ya sea sobrecargando métodos o creando  jerarquías de herencia y sobreescribiendo métodos, nos ahorraremos mucho tiempo y esfuerzo al escribir nuestros programas, además de que obtendremos un código más limpio y elegante.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *