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

这是我想出的解决方案:

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

这似乎奏效了。(顺便说一句,它之所以有效,是因为 fObj 并不是真正的 TInterfacedObject,而是一个具有公共 QueryInterface 方法的不同接口实现类)。

于 2009-11-13T05:08:25.363 回答
2

result := fObj as IntfT;应该可以工作,但显然编译器并不完全将接口理解为泛型。您应该在 QC 中报告此情况。

fObj.QueryInterface(IntfT,result);不起作用,因为 QueryInterface 是 TInterfacedObject 的受保护成员。此外,QueryInterface 通过调用 GetInterface 来工作,它查找 GUID,而 GUID 和泛型并不能很好地混合。

result := fObj as IInterface;确实适合我。你有什么问题?

于 2009-11-12T18:25:21.137 回答