Interfaces doubles multiples
Vous pouvez combiner les avantages d’une interface double (c’est-à-dire la flexibilité de la liaison vtable et tardive, ce qui rend la classe disponible pour les langages de script ainsi que C++) avec les techniques d’héritage multiple.
Bien qu’il soit possible d’exposer plusieurs interfaces doubles sur un seul objet COM, il n’est pas recommandé. S’il existe plusieurs interfaces doubles, il ne doit y avoir qu’une IDispatch
seule interface exposée. Les techniques disponibles pour s’assurer que c’est le cas portent des pénalités telles que la perte de fonction ou une complexité accrue du code. Le développeur considérant cette approche doit peser soigneusement les avantages et les inconvénients.
Exposition d’une interface IDispatch unique
Il est possible d’exposer plusieurs interfaces doubles sur un seul objet en dérivant de deux spécialisations ou plus de IDispatchImpl
. Toutefois, si vous autorisez les clients à interroger l’interface IDispatch
, vous devez utiliser la macro COM_INTERFACE_ENTRY2 (ou COM_INTERFACE_ENTRY_IID)) pour spécifier la classe de base à utiliser pour l’implémentation de IDispatch
.
COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface)
Étant donné qu’une IDispatch
seule interface est exposée, les clients qui peuvent uniquement accéder à vos objets via l’interface IDispatch
ne pourront pas accéder aux méthodes ou aux propriétés d’une autre interface.
Combinaison de plusieurs interfaces doubles en une seule implémentation d’IDispatch
ATL ne fournit aucune prise en charge de la combinaison de plusieurs interfaces doubles en une seule implémentation de IDispatch
. Toutefois, il existe plusieurs approches connues pour combiner manuellement les interfaces, telles que la création d’une classe basée sur un modèle qui contient une union des interfaces distinctes IDispatch
, la création d’un objet pour effectuer la QueryInterface
fonction ou l’utilisation d’une implémentation basée sur typeinfo d’objets imbriqués pour créer l’interface IDispatch
.
Ces approches présentent des problèmes liés aux collisions d’espaces de noms potentielles, ainsi qu’à la complexité du code et à la facilité de maintenance. Il n’est pas recommandé de créer plusieurs interfaces doubles.