| 1.1 Pourquoi utiliser l'interface? Par exemple: il existe un tel service de vente de billets, les cinémas peuvent vendre des billets, les opéra peuvent vendre des billets et les stations de passagers peuvent également vendre des billets. Services de vente de billets? Vous devez savoir que même les gestionnaires peuvent vendre des billets, ce qui n'est évidemment pas adapté pour inclure les gestionnaires dans la structure successive des services de vente de billets. Par conséquent, le service de vente de billets est une interface. 1.2 Comment utiliser les interfaces à Delphi | | 1.2.1 Déclarer l'interface imyInterface = interface (iiInterface) // Instructions (1) ['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}'] // Instructions (2) Fonction GetName ( const Str: String): String ; ;Fonction _release: entier ; fin ; Explication (1): S'il existe une relation continue, remplissez l'interface parent entre parenthèses, sinon, enregistrez-la, telle que: ImyInterface = interface. Remarque (2): Ce GUID est facultatif. Si vous souhaitez implémenter une interface avec COM, vous devez l'ajouter. L'exécution, comme la définition de la méthode d'interface. Remarque (3): L'interface doit implémenter ces trois fonctions. 1.2.2 Les services d'interface d'implémentation d'interface sont implémentés par les classes. Tintfclass = class (tobject, imyInterface) privatefCounter: Integer; frefCount: Integer; publicFunction QueryInterface (const iid: tGuid; out obj): hResult; Par exemple: var Aintf: imyInterface; beginaOBJ: = tintfclass.create; TryAINF: = (imyInterface (AOBJ); ... b. Utilisez le mécanisme intégré du compilateur Delphi. Par exemple: Aintf: = AOBJ.C. Utilisez la méthode de la question de la question de l'objet. L'interface doit être explicitement spécifiée à partir de IInterface L'interface hérite. Delphi vérifie l'interface elle-même si le code de libération n'est pas publié après l'utilisation et le programme généré est ajouté, mais cela provoque également des problèmes, tels que le code suivant: var i: entier; AOBJ: TintFClass; = Tintfclass.Create ; NIL est défini sur l'interface, et FreeandNil (AOBJ) relâchera Aintf, et l'objet a été publié lorsque AINTF est nul. , vous devez seulement réduire le nombre de références sans libérer. Délégation d'objet de classe. implémente l'interface: tipplclass = class (tobject, iImpLinterface) private frefcount: entier; fonction publique converttousd (const intd: Integer): double; end; implémentationFunction timpllclass.queryInterface (const iid: tGuid; out obj): hResult; commencer si getInterface (iid, obj) alors résultat: = 0 else Result: = e_nointerface; end; function mamplclass._release: Integer; Maintenant, il y a une autre classe TintfServiceClass pour implémenter l'interface IImpLinterface, il n'est pas nécessaire de le redéfinir. Avec un objet de classe, PublicContructor Create; délégué avec un objet. fin; implémentation est la suivante: Constructeur TintfServiceClass.Create; .Create; end; destructor tintfServiceClass.destroy; Le pointeur GOG d'interface est défini au déplacement VMT-72 dans l'interface et Rttidelphi: VMtintftable = -72. Fonction associée: getInterFaceCount; GetInterfaceable; Structure associée: TinterfaceEntry = Recordiid emballé: tGuid; VTable: Pointer; ioffset: Integer; ImpGetter: Integer; end; pinterFacetable = ^ TinterFacetable; TinterFacetable = RecordEntryCount emballé: End; Self est un pointeur vers un pointeur VMT, donc: self.getInterfacetable.EntryCount est équivalent à: aptr: = ppointer (Integeer ((pointeur (self)) ^) + vmtintftable) ^ aussi longtemps que vous utilisez le M + / M- m- Instruction dans la déclaration, des informations RTTI peuvent être ajoutées au programme compilé dans Delphi, tel que: {$ m +} iinvokable = interface (iiInterface) {$ m-} Les informations RTTI de l'interface sont définies par la structure d'enregistrement TintfMetadata: TintfMetadata = RecordName: String; Informations sur l'interface: pTypeInfo; // Pointer décrivant les informations d'interface ancinfo: ptypeInfo; // pointeur décrivant les informations du parent numanc: entier; // le nombre de méthodes héritées de l'interface parent final; , CCPascal, CCSTDCALL, CCSAFECALL); PTypeInfo; // Décrivez le pointeur d'informations du type de pass de back-pass de méthode Selfinfo: ptypeInfo; // pointeur d'informations décrivant la méthode elle-même params: tintfparamentryArray; // Array dynamique décrivant les informations paramètres hasrtti: booléen; // fait cette méthode booléenne Valeur Fin des informations RTTI; Format de support Fin des informations de type; |
|