【问题标题】:Querying for an Unknown Interface Type查询未知接口类型
【发布时间】:2009-11-12 17:53:25
【问题描述】:

在这段代码中:

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 的方法吗?

【问题讨论】:

    标签: delphi generics delphi-2010


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯,一个……是的,它确实有效。在我的实际代码中,我从 Items[] 属性进行类型转换,该属性应该是支持接口的类型,但由于某种原因,对于泛型,它无法识别。如果我将我的 Items 对象显式类型转换为支持接口的类型,那么它会突然起作用。谢谢。
    • Hmmmm... 仔细一看,“result := fObj as IInterface”似乎并没有那么好用。它只是将编译器错误延迟到以后。当您实际尝试使用 GetVal 作为适当的类型时,我收到一个编译器错误,提示“不兼容的类型:'ISomething' 和 'IInterface'”
    【解决方案2】:

    这是我想出的解决方案:

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

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

    【讨论】:

    • 不错!但即使使用 TInterfacedObject,您也可以使用:(FObj as IInterface).QueryInterface(GetTypeData(TypeInfo(IntfT)).Guid, Result);
    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 2013-05-12
    • 2021-12-27
    • 2011-08-26
    • 2020-06-28
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多