Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :


Delphi et les interfaces d'objet

Date de publication : 01/09/2005

Par Pascal Jankowski (Contributions)
 

En quelques mots, nous pouvons brièvement définir une interface objet ou interface comme la signature d'un objet, c'est à dire "ce qu'il fait" mais pas "comment il le fait". Ainsi plusieurs implémentations peuvent s'abonner à la même interface et l'implémentation d'un objet peut s'abonner à plusieurs interfaces.
Ce modèle permet le polymorphisme et favorise la réutilisation.
Nous allons tenter de décrire plus en détails cette notion d'interface, ainsi que sa mise en oeuvre.


I. Notion d'interface et intérêts
A. Principe d'encapsulation, abstraction.
B. Partage d'interfaces entre des classes, polymorphisme
C. Distribuer des objets dans un environnement réseau
D. Simuler le comportement de l'héritage multiple
E. Conclusion
II. Interface - Mise en oeuvre
A. Définir une interface
B. Implémenter une interface
1. Clauses de résolution de méthode
2. Modification de l'implémentation héritée
3. Implémentation des interfaces par délégation
a. Délégation à une propriété de type interface
b. Délégation à une propriété de type classe
C. Utiliser une interface
D. Références d'interface
E. Dérivation d'une interface
III. Interface IUnknown
IV. Identification d'une interface - GUID
V. Conventions d'appel
VI. Les objets automation
A. Les interfaces de répartition - dispinterface
B. Comment accéder aux objets automation
C. Les interfaces doubles


I. Notion d'interface et intérêts

Une interface définit des méthodes qui peuvent être implémentées par une classe. Elles sont déclarées comme des classes mais ne peuvent être directement instanciées et n'ont pas leurs propres définitions de méthodes. Cette responsabilité revient aux classes gérant une interface en fournissant l'implémentation des méthodes de l'interface.
Les interfaces proposent certains avantages de l'héritage multiple sans en avoir la complexité sémantique.
Elles jouent également un rôle important dans l'utilisation des modèles d'objets distribués comme COM, CORBA et SOAP.
Un atout supplémentaire réside dans le fait que les interfaces concues avec Delphi peuvent interopérer avec les objets écrits dans d'autres langages.


A. Principe d'encapsulation, abstraction.

L'encapsulation est un mécanisme qui consiste à rassembler les données et les méthodes au sein d'une structure en cachant l'implémentation de la classe. Cela revient à empêcher l'accés aux données par tout autre moyen que les services proposés. Ainsi, cela garantit l'intégrité des données contenues dans la classe.
Il est possible de mettre en oeuvre une protection plus importante encore en faisant appel à une interface qui jouera le rôle d'intermédiaire entre une application et une classe. Seules les méthodes définies dans l'interface et son implémentation dans la classe protégée pourront être invoquées par l'application.
Les interfaces sollicitent ainsi le principe d'abstraction.


B. Partage d'interfaces entre des classes, polymorphisme

Il arrive bien souvent que dans une modélisation objet, nous souhaitions que deux objets indépendants (ne descendant pas d'une classe commune), utilisent une même méthode. L'utilisation d'une interface permet alors de résoudre ce problème. En effet deux classes peuvent partager la même interface sans pour autant descendre de la même classe de base. Ainsi, un appel polymorphique de la même méthode est réalisable.

Dans le schéma ci-dessus, que les deux classes TCercle et TCarre aient ou non un ancêtre commun, elles disposent d'une méthode paint.
Il est possible d'obtenir le même résultat en faisant dériver TCercle et TSquare d'une même classe TFigure qui implémente la méthode virtuelle Paint. Dans ce cas, TCercle et TSquare doivent surcharger la méthode Paint. L'interface IPaint est alors substituée par TFigure comme schématisé ci-dessous.

L'avantage de passer par le modèle faisant usage de l'interface réside dans le fait que pour être sûr de dessiner un des objets, il suffit de passer par l'interface IPaint qui dispose de la méthode Paint et qui garantit que tous les objets associés à cette interface vont obligatoirement implémenter cette méthode.

C. Distribuer des objets dans un environnement réseau

La technologie des objets distribués permet de rendre accessible des objets à tout ordinateur connecté au réseau. Le principe de cette technologie est de décrire les fonctionalités des objets "distribuables" par le biais d'une interface. C'est le moyen de mettre à disposition du client le service fourni par l'objet, sans lui donner les détails de l'implémentation de celui-ci. Cela permet alors d'utiliser des objets distants comme s'ils résidaient localement sur votre station.

Notons, de façon générale, qu'utiliser les interfaces permet de conserver la compatibilité entre les objets et le code du client. Il n'est pas nécessaire de recompiler les clients car l'implémentation des interfaces est cachée (les méthodes et leurs propriétés restent inchangées). Le développeur peut modifier l'implémentation afin d'améliorer les performances, ou pour d'autres motifs, sans perturber le code client qui dépend de cette interface.
Dans un autre cas de figure, un objet distribué initialement prévu pour une application client peut être récupéré et utilisé par un second applicatif client, cela favorise ainsi la réutilisation.

Citons la technologie COM (Component Object Modèle) de Microsoft et sa version DCOM (Distributed Component Object Model). Ce modèle de composant logiciel est indépendant du langage et il permet l'interaction entre les composants logiciels et les applications. Microsoft a étendu cette technologie avec ActiveX, qui est essentiellement utilisée pour le développement Intranet.
Afin d'aborder cette technologie plus en détail, je vous renvoie vers une description du modèle COM par Dick Lantim.
Citons encore la technologie CORBA (Common Object Request Broker Architecture) mise en place par un organisme international OMG, regroupant différents acteurs informatique. En opposition au modèle COM, CORBA offre la possibilité de distribuer des objets sur différentes plates-formes. Vous pouvez consulter les meilleurs cours et tutoriels sur www.developpez.com.

D. Simuler le comportement de l'héritage multiple

Dans certaines situations, il peut s'avérer intéressant d'élargir le mécanisme d'héritage pour qu'une classe hérite directement de plusieurs autres classes. Elle hérite alors de l'union des champs et des méthodes de ses ancêtres. On parle alors d'héritage multiple.
L'héritage multiple est interdit pour les classes Delphi afin d'éviter les conflits qui se produisent lorsqu'une classe hérite de deux méthodes portant le même identificateur (collision).
Citons par exemple, le cas de l'héritage triangulaire, où une classe TD hérite à la fois de deux classes TB et TC qui elles-mêmes héritent d'une classe TA.
Comment se comporte alors une méthode TD héritée de TA ?

Les interfaces permettent de résoudre simplement de tels conflits car elles obligent les classes à implémenter toutes les méthodes décrites dans l'interface.
D'autre part, une classe peut supporter plusieurs interfaces, comme si elle "héritait" de plusieurs classes, ce qui simule le comportement de l'héritage multiple.


E. Conclusion

A l'issue de cette première approche, nous voyons qu'une interface est un ensemble de "prototypes" de méthodes. Une interface permet de procurer le "polymorphisme de méthodes" et simule élégamment l'héritage multiple. Par ailleurs, leur utilisation permet de faciliter la maintenance et l'évolution du code, tout en favorisant sa réutilisation.

"Et bien plus qu'un modèle pour les technologies des objets distribués, c'est avant tout une technique de développement". (cf Olivier Dahan).

II. Interface - Mise en oeuvre


A. Définir une interface


B. Implémenter une interface


1. Clauses de résolution de méthode


2. Modification de l'implémentation héritée


3. Implémentation des interfaces par délégation


a. Délégation à une propriété de type interface


b. Délégation à une propriété de type classe


C. Utiliser une interface


D. Références d'interface


E. Dérivation d'une interface


III. Interface IUnknown


IV. Identification d'une interface - GUID


V. Conventions d'appel


VI. Les objets automation


A. Les interfaces de répartition - dispinterface


B. Comment accéder aux objets automation


C. Les interfaces doubles



Copyright © 2005 Pascal Jankowski. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -