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, c’est-à-dire 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 disposant d’un pointeur par le biais duquel il peut accéder au tableau peut appeler les méthodes de cette interface.

Parler précisément de cette indirection multiple n’est pas pratique, donc au lieu de cela, le pointeur vers la table de fonction d’interface qu’un autre objet doit avoir pour appeler ses méthodes est simplement appelé 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 (qui est inhérente à C et C++), un client peut appeler une méthode d’interface via son nom, et non sa position dans le tableau. Étant donné qu’une interface est un type, le compilateur, en fonction des noms de méthodes, peut case activée 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 précisément à un objet s’il prend en charge la sémantique de l’interface, sans surcharge inutile et sans la confusion qui pourrait survenir dans un système en cas d’avoir plusieurs versions d’une même interface portant le même nom.

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

  • Une interface COM n’est pas identique à 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, ce que COM ne spécifie pas. Un instance d’un objet qui implémente une interface doit être créé 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 connexes et est la norme binaire par 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 (GUID), ce qui élimine la possibilité de duplication qui pourrait se produire avec n’importe quel autre schéma de nommage.
  • 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 exposer des interfaces qui sont des révisions successives d’une interface, avec différents identificateurs. Par conséquent, chaque interface est un contrat distinct et les objets à l’échelle du système n’ont pas besoin de se soucier de savoir si la version de l’interface qu’ils appellent est celle qu’ils attendent. L’ID d’interface (IID) définit le contrat d’interface de manière explicite et unique.

Objets et interfaces COM