10

何年にもわたる Delphi プログラミングにもかかわらず、IUnknown をサポートするクラスで見たことのないクラス宣言スタイルに出くわしました。

TBCUnknown = class(TBCBaseObject, IUnKnown)
private
  FRefCount: integer;
  FOwner   : Pointer;
protected
  function IUnknown.QueryInterface = NonDelegatingQueryInterface;
  function IUnknown._AddRef = NonDelegatingAddRef;
  function IUnknown._Release = NonDelegatingRelease;
  function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
...

ご覧のとおり、IUnknown インターフェイス メソッドへのクラス メソッドの割り当ては、クラス宣言で直接行われています。コンストラクターが呼び出される前に、IUnknown メソッドがどのように割り当てられるかがわからないため、これは特に奇妙に見えます。これは、クラスのメソッドと、後で実行時に解決される、クラスが受け入れるインターフェイスのインターフェイス ポインターとの間の割り当てを行うためのコンパイル時のショートカットのようなものですか? これがどのように機能するか、およびこの種の構造をサポートする Delphi イディオムについて誰かが少し情報を提供できれば、私は知りたいです。

4

2 に答える 2

12

これはMethod Resolution Clauseと呼ばれ、指定されたインターフェイス メソッドを実際に実装するメソッドを指定できます。これは、実装メソッドがインターフェイスで宣言されたメソッドとは異なる名前を持つことができることを意味します (ただし、メソッドのシグネチャは一致する必要があります)。この節がない場合、Delphi は名前に基づいて実装メソッドを自動的に解決します。

あなたの例では、宣言はによって実装されていることを意味IUnknown._AddRefTBCUnknown.NonDelegatingAddRefます。IUnknown._ReleaseTBCUnknown.NonDelegatingRelease

私の知る限り、これはインターフェイス サポートが言語に追加された当初からサポートされています。あまり使用されていないか必要とされていないため、おそらく気づいていないでしょう。

于 2011-11-14T16:00:24.167 に答える
3

これは、メソッド解決条項として知られているものです。ドキュメントから引用するには:

クラス宣言にメソッド解決句を含めることで、デフォルトの名前ベースのマッピングをオーバーライドできます。同じ名前のメソッドを持つ 2 つ以上のインターフェイスをクラスが実装する場合は、メソッド解決句を使用して名前の競合を解決します。

于 2011-11-14T16:02:09.610 に答える