Partager via


Pointeurs d’interface et interfaces

Une instance d’une implémentation d’interface est en fait un pointeur vers un tableau de pointeurs vers des méthodes, autrement dit une table de fonctions qui fait référence à une implémentation de toutes les méthodes spécifiées dans l’interface. Les objets avec plusieurs interfaces peuvent fournir des pointeurs vers plusieurs tables de fonctions. Tout code qui a un pointeur par le biais duquel il peut accéder au tableau peut appeler les méthodes dans cette interface.

En parlant précisément de ce multiple indirection est peu pratique, donc au lieu de cela, le pointeur vers la table de fonctions d’interface qu’un autre objet doit avoir à appeler ses méthodes est appelé simplement un pointeur d’interface . Vous pouvez créer manuellement des tables de fonctions dans une application C ou presque automatiquement à l’aide de Visual C++ (ou d’autres langages orientés objet qui prennent en charge COM).

Avec la prise en charge appropriée du compilateur (inhérente à C et C++), un client peut appeler une méthode d’interface par le biais de son nom, et non de sa position dans le tableau. Étant donné qu’une interface est un type, le compilateur, en fonction des noms de méthodes, peut vérifier les types de paramètres et les valeurs de retour de chaque appel de méthode d’interface. En revanche, si un client utilise un schéma d’appel basé sur la position, cette vérification de type n’est pas disponible, même en C ou C++.

Chaque interface est un contrat immuable d’un groupe fonctionnel de méthodes. Vous référencez une interface au moment de l’exécution avec un identificateur d’interface global unique (IID). Cet IID, qui est une instance spécifique d’un identificateur global unique (GUID) pris en charge par COM, permet à un client de demander à un objet précisément s’il prend en charge la sémantique de l’interface, sans surcharge inutile et sans confusion qui pourrait survenir dans un système d’avoir plusieurs versions de la même interface portant le même nom.

Pour résumer, il est important de comprendre ce qu’est une interface COM et non :

  • Une interface COM n’est pas la même qu’une classe C++. La définition virtuelle pure ne comporte aucune implémentation. Si vous êtes programmeur C++, vous pouvez définir votre implémentation d’une interface en tant que classe, mais cela se trouve sous le titre des détails de l’implémentation, que COM ne spécifie pas. Une instance d’un objet qui implémente une interface doit être créée pour que l’interface existe réellement. En outre, différentes classes d’objets peuvent implémenter une interface différemment mais être utilisées de manière interchangeable sous forme binaire, tant que le comportement est conforme à la définition de l’interface.
  • Une interface COM n’est pas un objet. Il s’agit simplement d’un groupe de fonctions connexe et est la norme binaire par le biais de laquelle les clients et les objets communiquent. Tant qu’il peut fournir des pointeurs vers des méthodes d’interface, l’objet peut être implémenté dans n’importe quel langage avec n’importe quelle représentation d’état interne.
  • Les interfaces COM sont fortement typées. Chaque interface a son propre identificateur d’interface (un GUID), ce qui élimine la possibilité de duplication qui pourrait se produire avec n’importe quel autre schéma d’affectation de noms.
  • Les interfaces COM sont immuables. Vous ne pouvez pas définir une nouvelle version d’une ancienne interface et lui donner le même identificateur. L’ajout ou la suppression de méthodes d’une interface ou la modification de la sémantique crée une nouvelle interface, et non une nouvelle version d’une ancienne interface. Par conséquent, une nouvelle interface ne peut pas entrer en conflit avec une ancienne interface. Toutefois, les objets peuvent prendre en charge plusieurs interfaces simultanément et peuvent exposer des interfaces qui sont des révisions successives d’une interface, avec différents identificateurs. Ainsi, chaque interface est un contrat distinct, et les objets à l’échelle du système ne doivent pas être préoccupés par le fait que la version de l’interface qu’ils appellent est celle qu’ils attendent. L’ID d’interface (IID) définit le contrat d’interface explicitement et de manière unique.

objets et interfaces COM