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: 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