1

このコードでは:

TTest<IntfT: IInterface> = class
protected
  fObj : TInterfacedObject;
public
  function  GetVal: IntfT;
end;

fObjをIntfTとして返すようにするには、GetVal関数をどのように実装しますか?

私はもう試した:

result := fObj as IntfT;

fObj.QueryInterface(IntfT,result);

result := fObj as IInterface;

しかし、何も機能していないようです。これはとても単純なことのように思えます、私は何かが欠けているに違いないと思い続けます。

何か案は?

編集

今私にとって最も有望に見えるのはQueryInterfaceです。現在、コンパイラはIntfTがGUIDではないと文句を言っており、適切なGUIDがあれば、すべてが満足できるという印象を受けます。この状況で機能するインターフェースタイプからIIDを取得する方法を知っている人はいますか?

4

2 に答える 2

2

result := fObj as IntfT;動作するはずですが、コンパイラはインターフェイスをジェネリックとして完全に理解していないようです。これはQCで報告する必要があります。

fObj.QueryInterface(IntfT,result);QueryInterfaceはTInterfacedObjectの保護されたメンバーであるため、機能しません。また、QueryInterfaceは、GUIDを探すGetInterfaceを呼び出すことで機能しますが、GUIDとジェネリックスはそれほどうまく混在していません。

result := fObj as IInterface;私のために正しくコンパイルします。どんな問題がありますか?

于 2009-11-12T18:25:21.137 に答える
2

これが私が思いついた解決策です:

function TTest<IntfT>.GetVal: IntfT;
begin
  fObj.QueryInterface(GetTypeData(TypeInfo(T)).Guid,result);
end;

そして、それはうまくいくようです。(ところで、fObjは実際にはTInterfacedObjectではなく、パブリックQueryInterfaceメソッドを持つ別のインターフェイス実装クラスであるため機能します)。

于 2009-11-13T05:08:25.363 に答える