Delphiの下でのインターフェイスプログラミング学習ノート(オリジナル)
著者:Eve Cole
更新時間:2025-02-21 19:48:02
| Delphiの下でのインターフェイスプログラミング | | |
|
| Delphiに基づくインターフェイスプログラミング学習ノート |
|
| 1.1インターフェイスを使用する理由たとえば、このようなチケット販売サービスがあり、シネマはチケットを販売し、オペラハウスはチケットを販売し、乗客局もチケットを販売できます。チケット販売サービス?マネージャーでさえチケットを販売できることを知っておく必要があります。これは明らかに、必要なチケット販売サービスの継承構造にマネージャーを含めるのに適していません。したがって、チケット販売サービスは、映画、オペラハウス、その他のサービスに従う限り、インターフェースです。 1.2 Delphiでインターフェイスを使用する方法 | | 1.2.1インターフェイスImyInterface = interface ( iiinterface )//命令(1)['{63E072DF-B81E-4734-B3CB- 3C23C7FDA8EA }'] const iid : obj : hresult _addref ;関数_Release:integer ;終了;説明(1):継続的な関係がある場合は、ブラケットの親インターフェイスを入力します。それ以外の場合は、次のように保存します。注(2):このGUIDは、com特性を持つインターフェイスを実装する場合は、DelphiのGUIDを追加する必要があります。インターフェイスメソッドの定義などのランタイム。注(3):インターフェイスは、これら3つの関数を実装する必要があります。 1.2.2インターフェイス実装インターフェイスサービスは、クラスごとに実装されます。 tintfclass = class(tobject、imyinterface)privatefcounter:frefcount:integer; public -function queryinterface(const iid:tguid; out obj):hresult; 例:var aintf:imyinterface; beginaobj:= tintfclass.create; tryaintf:=(imyinterface(aobj); ... b。delphiコンパイラの組み込みメカニズムを使用します。たとえば、オブジェクトのQueryInterfaceメソッド(AOBJ.QueryInterface)。インターフェイスは、インターフェイスを継承するIinterfaceから明示的に指定する必要があります。DELPHI7のGUID値を持つ必要があります。 Delphiは、使用後にリリースコードがリリースされない場合、次のコードを引き起こします。 = tintfclass 。 Nilはインターフェースに設定され、Freeandnil(AOBJ)はAINTFを再度リリースし、AINTFがこの問題を解決するときに、オブジェクトの寿命を妨げないようにします、リリースすることなく参照数を減らす必要があります。クラスオブジェクトの委任。次のインターフェイス定義が既にある場合: Iimplinterface (iiinterface)function convertusd:double; function converttormb(const intd:integer):double;インターフェイスを実装してください:TimplClass = class(tobject、iimplinterface)プライベートフレフカウント:integer; public function convertd(const intd:integer):double; GetInterface(iid、obj)からresult:= 0 else result:= e_nointerface; end; function timplclass._release:integer;これで、Iimplinterfaceインターフェイスを実装するための別のクラスがありますクラスのオブジェクトは、オーバーロードを作成しますオブジェクトに委任されます。 End; Constructor TintfserviceClass.create:= Timplclass.Create; 。インターフェイスGOGポインターは、インターフェイスのVMT -72変位で定義され、rttidelphi:vmtintftable = -72。関連関数:getinterfacecount; interfaceTableを取得します。関連構造:TINTERFACEENTRY = Packed Recordiid:tguid; vtable:pointer; ioffset:integer:integer; end; pinterfacetable = ^tinterfacetable; tinterfacetable; packed recordercount:integer; entries:array [0..999] of tintersaceentry; end;自己はVMTポインターへのポインターです。SELF.GETINTERFACETABLE.ENTRYCOUNTは次のとおりです。宣言での指示:{$ m+} iinvokable = interface(iiinterface){$ m-}など、delphiでコンパイルされたプログラムにRTTI情報を追加できます。 = RecordName:String; //インターフェイス名Unitname; //インターフェイスMDAで宣言されたプログラムユニット名://インターフェイスにメソッド情報を格納するダイナミックアレイIID:TGUID; // GUID値のGUID値インターフェイス情報:PTYPEIENFO; //インターフェイス情報の説明ANCINFO:PTYPEINFO; 、ccpascal、ccstdcall、ccsafecall); tintfmethentry:string; // method name cc:tcallconv; ptypeinfo; //メソッドの情報ポインターを説明するバックパスタイプselfinfo:ptypeinfo; //メソッド自体を説明する情報ポインターパラメーター://パラメーター情報を説明するダイナミックアレイhasrtti://この方法はブレアンを持っていますかRTTI情報の値。スタンドフォーマットタイプ情報の終わり。 |
|