next up previous contents index
Next: Comment traiter de façon Up: Héritage et polymorphisme vertical Previous: Héritage et polymorphisme vertical

Classes dont on aurait envie de designer plus qu'un parent

On veut souvent réutiliser du code de plusieurs autres classes en principe non reliés: par exemple, la classe pointcoloré pourrait être vue comme une sous-classe à la fois de point et de couleur, pour reutilisrer du code. Certains langages permettent de faire cela, à travers l' héritage multiple

Cependant, il y a souvent des cas où on veut bien qu'un objet donné puisse répondre à des messages qui ne sont pas déclarés dans sa classe, mais sans besoin de définir une sous-classe à chaque fois: c'est le cas par exemple d'un ministre qui dans certains conditions doit accepter un message négocier, même s'il n'est pas capable de négocier. On pourrait alors définir une sous-classe ministrenégociateur qui hérite à la fois de ministre et de négociateur, mais on risque de voir vite proliférer la hiérarchie des classe avec la nécessité de ministre-expert, ministre-anglophone, et plein d'autres mélanges possibles. Dans ce type de situation, il est souvent plus naturel de ``passer'' le message (anglais: forward) à d'autres objets d'autres classes qui savent le gérer: on fait la du message forwarding.

héritage multiple
: il est supporté dans la version 3.0 et suivantes de C++, il est absent dans Java et Objective-C.
message forwarding
il est supporté explicitement dans Objective-C, où chaque objet qui ne reconnaît pas un message qu'on lui adresse se voit offrir la possibilité de passer ce message à quelq'un d'autre à travers l'envoi par le système d'un message forward. On peut bidouiller pour le simuler dans Java et C++ à travers l'object containement, mais l'élégance du mécanisme est perdue. Notez que pour que cela puisse fonctionner on a besoin de pouvoir passer des messages comme paramètres à run-time.Voici un exemple en Objective-C:
  - forward:(SEL)aSelector :(marg_list)argFrame
  {if ( [monDiplomat respondsTo:aSelector] )
          return [monDiplomat performv:aSelector :argFrame];
      else if ( [monInterprete respondsTo:aSelector] )
               return [monInterprete performv:aSelector :argFrame];
           else  return self; }

Le mécanisme du message-forwarding permet de simuler l'héritage et quelques aspects de l'héritage multiple, tout en gardant un nombre réduit de classes.


next up previous contents index
Next: Comment traiter de façon Up: Héritage et polymorphisme vertical Previous: Héritage et polymorphisme vertical

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