| 1.1 Warum Schnittstelle verwenden? Zum Beispiel: Es gibt einen solchen Verkaufsservice, Kinos können Tickets verkaufen, Opernhäuser können Tickets verkaufen, und Passagierstationen können auch Tickets verkaufen. Ticketverkaufsdienste? Sie sollten wissen, dass selbst Manager Tickets verkaufen können, was offensichtlich nicht geeignet ist, Manager in die Erbschaftsstruktur von Ticketverkaufsdiensten aufzunehmen. Daher ist der Ticketverkaufsservice eine Schnittstelle. 1.2 So verwenden Sie Schnittstellen in Delphi | | 1.2.1 Deklar-Schnittstelle imyInterface = interface (iiInterface) // Anweisungen (1) ['{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}'] // Anweisungen (2) Funktion GetName ( const str: String): String ; ;Funktion _Release: Integer ; Ende ; Erläuterung (1): Wenn es eine anhaltende Beziehung gibt, füllen Sie die übergeordnete Schnittstelle in Klammern aus, sonst speichern Sie sie, wie z. B. IMYInterface = Schnittstelle. Hinweis (2): Diese Richtlinie ist optional. Laufzeit, wie die Definition der Schnittstellenmethode. Hinweis (3): Die Schnittstelle muss diese drei Funktionen implementieren. 1.2.2 Schnittstellen -Implementierungs -Schnittstellendienste werden nach Klassen implementiert. Tintfclass = class (tobject, iMyInterface) privatfcounter: Integer; FrefCount: Integer; PublicFunction QueryInterface (const iid: tguid; out obj): hresult; Zum Beispiel: var Aintf: ImyInterface; beginaobj: = tintfClass.create; tryaintf: = (ImyInterface (AOBJ); ... b. Verwenden Sie den integrierten Mechanismus des Delphi-Compilers. Zum Beispiel: Aintf: = AOBJ.C. Verwenden Sie die Abfrage -Methode des Objekts. Die Schnittstelle muss explizit aus iInterface angegeben werden. Die Schnittstelle erbringt. Delphi überprüft die Schnittstelle selbst, wenn der Release -Code nach dem Gebrauch nicht veröffentlicht wird und das generierte Programm auch Probleme verursacht, wie der folgende Code: Var I: Integer; = Tintfclass.create ; NIL ist auf die Schnittstelle eingestellt, und Freeandnil (AOBJ) wird AINTF erneut veröffentlichen, und das Objekt wurde freigegeben, wenn Aintf NIL löst Sie müssen die Referenzzahl nur ohne Freigabe reduzieren. Delegation von Klassenobjekten Implementiert die Schnittstelle: TimplClass = Klasse (Tobject, IimPlinterface) Private FrefCount: Integer; öffentliche Funktion ConvertToUSD (const intd: Integer): double; Beginnen Sie, wenn GetInterface (IID, OBJ) dann Ergebnis: = 0 ERELTUNG: = E_NOInterface; End; Funktion TimplClass._Release: Integer; Jetzt gibt es eine andere Klasse TintfServiceClass, um die IImPlinterface -Schnittstelle zu implementieren. Verwenden Sie sie nicht neu. Mit einem Klassenobjekt überlasten mit einem Objekt delegiert. Ende; Implementierung ist wie folgt: Konstruktor TintfServiceClass.create; .Create; End; Destructor TintfServiceClass.Destroy; Der Schnittstellen -GOG -Zeiger wird an der VMT -72 -Verschiebung in der Schnittstelle und RTTIDELPHI definiert: VMTIntftable = -72. Verwandte Funktion: GetInterfaceCount; GetInterfacetable; // die Schnittstellentabelle erhalten. Verwandte Struktur: tinterfaceEntry = verpackter Aufzeichnungen: tguid; vtable: pointer; ioffset: Integer; implner: Integer; Ende; PinterFacetable = ^tinterfacetable; Selbst ist ein Zeiger auf einen VMT-Zeiger, also: self.getInterfacetable Anweisungen in der Deklaration, RTTI-Informationen können dem in Delphi kompilierten Programm hinzugefügt werden, wie z. = RecordName: String; Schnittstelleninfo: PTYPeinfo; // Zeiger, die Schnittstelleninformationen beschreiben Ancinfo: PTYPeinfo; // Zeiger beschreiben übergeordnete Informationen. CCPASCAL, CCSTDCALL, CCSAFECALL); Ptypeinfo; // Beschreiben Sie den Informationszeiger des Methode Backpass Type SelfInfo: pTypeinfo; // Informationszeiger, der die Methode selbst Params beschreibt: tintfparamentryArray; // Dynamisches Array, das Parameterinformationen beschreibt, hasrtti: boolean; // hat diese Methode die Boolean Wertende der RTTI -Informationen; Standformatende der Typinformationen; |
|