首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Delphi TInterfaceList中存储和定位多个接口类型

如何在Delphi TInterfaceList中存储和定位多个接口类型
EN

Stack Overflow用户
提问于 2010-06-02 23:32:19
回答 3查看 1.6K关注 0票数 6

我将来自一系列对象的小接口存储到单个TInterfaceList“存储”中,目的是向最终用户提供特定接口类型的列表,因此每个接口将公开一个“GetName”函数,但所有其他方法对于该接口类型都是唯一的。例如,这里有两个接口:

代码语言:javascript
复制
  IBase = interface
    //----------------------------------------
    function GetName : string;
    //----------------------------------------
  end;

  IMeasureTemperature = interface(IBase)
    //------------------------------------
    function MeasureTemperature : double;
    //----------------------------------------
  end;

  IMeasureHumidity = interface(IBase)
    //----------------------------------------
    function MeasureHumidity: double;
    //----------------------------------------
  end;

我将这些接口中的几个放到一个TInterfaceList中,然后我想扫描列表以查找特定的接口类型(例如'IMeasureTemperature')构建另一个指向导出这些接口的对象的指针列表。我不希望对这些对象的位置做任何假设,有些对象可能会导出多种类型的接口。我知道我可以用一个类层次结构来做到这一点,使用如下代码:

代码语言:javascript
复制
  If FList[I] is TMeasureTemperature then ..

但是我想做一些类似于接口类型的事情,这可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-03 01:11:54

我想这可能会满足你的需求。

代码语言:javascript
复制
function InterfaceRefIsInterface(Intf : IUnknown; ExpectedIntf : TGUID) : Boolean;
var vReference : IUnknown;
begin
  if Supports(Intf, ExpectedIntf, vReference)  then
    Result := Intf = vReference
  else
    Result := False;
end;

我不确定当Intf和ExpectedIntf相互继承时,函数将如何运行,但如果Intf与ExpectedIntf完全匹配,这将返回TRUE。

在您的示例中,IMeasureHumidity不会在IMeasureTemperature上返回true,但我不确定它对IBase会有什么反应。根据初步测试,在IBase上也会返回FALSE。

票数 2
EN

Stack Overflow用户

发布于 2010-06-02 23:49:40

只需使用支持,如下所示:

代码语言:javascript
复制
var
  oMTIntf: IMeasureTemperature;
...
  If Supports(FList[I], IMeasureTemperature, oMTIntf) then .. 
票数 6
EN

Stack Overflow用户

发布于 2010-06-03 00:03:46

您可以在SysUtils中使用Supports函数,它们非常安全(除非您在实例化的内存上尝试它们),并且您只需要一个与您尝试强制转换为的接口类型完全相同的目标变量:

代码语言:javascript
复制
procedure DoSomethingInList(AList: IInterfaceList;);
var
  i: Integer;
  liItem: IInterface;
  liMeasureTemp: IMeasureTemperature;
  liMeasureHumi: IMeasureHumidity;
begin
  AList.Lock;
  try
    for i := 0 to AList.Count - 1 do
    begin
      liItem := AList[i];
      if Supports(liItem, IMeasureTemperature, liMeasureTemp) then
        //... liMeasureTemp.MeasureTemperature ...
      else if Supports(liItem, IMeasureHumidity, liMeasureHumi) then
        //... liMeasureHumi.MeasureHumidity ...
      else 
        //...
    end;
  finally
    AList.Unlock;
  end;
end; 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2959163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档