在此代码中:

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


如果我希望GetVal函数将fObj作为IntfT返回,该如何实现?

我试过了:

result := fObj as IntfT;




fObj.QueryInterface(IntfT,result);




result := fObj as IInterface;


但似乎没有任何效果。这似乎是一件简单的事情,我一直认为我一定会丢失一些东西。

有任何想法吗?

编辑

对我来说,现在看来最有前途的是QueryInterface。当前,编译器抱怨IntfT不是GUID,而我的印象是,如果我拥有适当的GUID,一切都会很高兴。有人知道在这种情况下可以从接口类型获取IID的方法吗?

最佳答案

result := fObj as IntfT;应该可以工作,但是显然编译器不太了解接口是泛型的。您应该在质量控制中报告此情况。

fObj.QueryInterface(IntfT,result);不起作用,因为QueryInterface是TInterfacedObject的受保护成员。同样,QueryInterface通过调用GetInterface来工作,该方法查找GUID,而GUID和泛型并不能很好地融合在一起。

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

10-04 17:27