next up previous contents index
Next: Caractéristiques des classes Up: Panoramique et comparaison de Previous: Délégation

Liaison tardive et dynamique

Dans les langages orientés objets, le polymorphisme et l'héritage ne peuvent marcher correctement que si la méthode exécutée par un objet qui reçoit un message dépend du type de l'objet à run-time et non pas du type statique connu à la compilation.

Cela n'est pas la conduite par défaut de C++: là, une méthode (disons affiche) qui n'est pas déclarée virtual est liée statiquement, et un colorpoint qui reçoit le message affiche ne va pas afficher la couleur.

Si par contre on prend en compte le type de l'objet à runtime, on voit que ce type est souvent, en réalité, plus petit (un sous-type) du type statiquement connu à la compilation. Si c'est ce type plus petit que l'on prend en compte pour sélectionner le message, on parle alors de liaison tardive , ce qui s'explique bien par la liaison tardive de self dans le modèle à enregistrements. Cela se fait en C++ pour les méthodes déclarés virtual, pas un joli nom, mais cela vient du fait que ils sont souvent utilisés pour définir des super-classes abstraites, où la liaison tardive est nécessaire.
Cependant, la solution C++ reste aussi un hack: cela se voit avec le problème de la super-classe fragile 1.6.

Toutefois, dans les deux cas qu'on vient de voir, on peut tout compiler de façon à pouvoir faire marcher le programme sans besoin de garder l'information de type à l'exécution: il suffit d'utiliser une table de fonctions construite en parallèle avec la hiérarchie d'héritage.
Cependant, il y a des situations où on doit travailler avec l'assumption de monde ouvert  (on ne connaît pas tout à la compilation) et non pas celle trop restrictive de monde fermé  (on connaît pas tout à la compilation). Ce genre de situation se présente souvent dans le dessin de GUI (interface graphique utilisateur), où la classe d'un objet qui reçoit un message cut ne peux normalement pas être connue à la compilation.

Il y a des langages, comme Objective-C, où l'on permet, pour gérer ces situations, la liaison dynamique , c'est à dire, il est possible que à runtime l'objet qui se trouve à la place d'une variable dans le programme source aie un type qui n'est même pas un sous-type de celui connu à la compilation. Cela exige une étape supplémentaire ou l'on cherche le message dans une liste chainée de tableaux, sans figer l'adresse physique du code comme en C++.

La documentation de Java semble indiquer que cela est possible dans Java\ aussi.


next up previous contents index
Next: Caractéristiques des classes Up: Panoramique et comparaison de Previous: Délégation

Roberto DiCosmo
Mon Jun 3 18:29:31 MET DST 1996