Caso práctico
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.