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: Caractéristiques des classes Up: Panoramique et comparaison de Previous: Délégation Roberto DiCosmo
Mon Jun 3 18:29:31 MET DST 1996