Saltar la navegación

6.- Polimorfismo.

Caso práctico

Foto de Ada mirando al frente.
Ministerio de Educación y FP (CC BY-NC)

María está desarrollando algunas clases que representan categorías de animales para el proyecto de la Clínica Veterinaria. En algunos casos declara objetos de un tipo de animal y en ciertas ocasiones de otros, según las necesidades que tenga en cada momento. La clase Animal es demasiado genérica como para poder utilizarla en determinados casos y necesita clases más específicas para poder trabajar pues tendrá que usar unas u otras versiones de sus métodos. Juan también está haciendo algo parecido y ambos intuyen que el código que están escribiendo podría ser mucho más sencillo y flexible si pudieran declarar inicialmente objetos de la clase Animal y más tarde, durante la ejecución de la aplicación, utilizar objetos de tipo Animal, pero de clases más especializadas (subclases de Animal) en función de lo que suceda en cada momento. Sería muy interesante poder hacer algo así. Ada lleva algunos minutos escuchándolos y decide intervenir:

- "Veo que habéis llegado a la conclusión de que necesitáis trabajar con objetos cuya clase aún no está clara en tiempo de compilación, ¿no?". - Les pregunta a ambos.

- "Así es. Pero eso no se puede hacer, el compilador no nos lo va a permitir". - Le responden casi al unísono.

- "Bueno, es lógico que el compilador tenga que saber a qué clase pertenece un objeto para poder analizar si se está accediendo a los miembros correctos y con la sintaxis apropiada, ¿no crees?". - Les vuelve a preguntar.

- "Totalmente de acuerdo.". - Le contesta María.

- "Pero si declaramos un objeto de una clase que sea superclase de otras, quizá podríamos más tarde intentar para ese objeto instanciar una subclase más específica. Al fin y al cabo, una clase de tipo MascotaDoméstica sigue siendo también Animal, pues ha heredado de ella, ¿no es así?".

- "¿Quieres decir que podríamos utilizar en el programa objetos de clases cuyos métodos llamados no sabemos exactamente cuáles van a ser porque dependerá de la subclase concreta que se instancie en tiempo de ejecución?". - Le responde María muy interesada.

- "Parece que ha llegado el momento de que empecéis a trabajar con el polimorfismo y la ligadura dinámica". - Les contesta satisfecha.

Indica que la vinculación que se produce en la llamada a un método con la clase a la que pertenece ese método se realiza en tiempo de ejecución. Es decir, que al generar el código ejecutable no se conoce exactamente el método (a qué clase pertenece) que será llamado. Sólo se sabrá cuando el programa esté en ejecución.

Un conjunto de formas diferentes (siluetas de tortuga, corazón, oso, árbol, etc.)..
Alessandro Pinna (CC BY-SA)


El polimorfismo es otro de los grandes pilares sobre los que se sustenta la Programación Orientada a Objetos (junto con la encapsulación y la herencia). Se trata nuevamente de otra forma más de establecer diferencias entre interfaz e implementación, es decir, entre el qué y el cómo.

La encapsulación te ha permitido agrupar características (atributos) y comportamientos (métodos) dentro de una misma unidad (clase), pudiendo darles un mayor o menor componente de visibilidad, y permitiendo separar al máximo posible la interfaz de la implementación. Por otro lado la herencia te ha proporcionado la posibilidad de tratar a los objetos como pertenecientes a una jerarquía de clases. Esta capacidad va a ser fundamental a la hora de poder manipular muchos posibles objetos de clases diferentes como si fueran de la misma clase (polimorfismo).

El polimorfismo te va a permitir mejorar la organización y la legibilidad del código así como la posibilidad de desarrollar aplicaciones que sean más fáciles de ampliar a la hora de incorporar nuevas funcionalidades. Si la implementación y la utilización de las clases es lo suficientemente genérica y extensible será más sencillo poder volver a este código para incluir nuevos requerimientos.

Autoevaluación

Pregunta

¿Cuál de las siguientes características dirías que no es una de las que se suelen considerar como uno de los tres grandes pilares de la Programación Orientada a Objetos?

Respuestas

Recursividad.

Herencia.

Polimorfismo.

Encapsulación.

Retroalimentación