我将来自一系列对象的小接口存储到单个TInterfaceList'store'中,目的是向最终用户提供特定接口类型的列表,因此每个接口都将公开一个'GetName'函数,但所有其他方法都是唯一的那个接口类型.例如,这里有两个接口:
IBase = interface
//----------------------------------------
function GetName : string;
//----------------------------------------
end;
IMeasureTemperature = interface(IBase)
//------------------------------------
function MeasureTemperature : double;
//----------------------------------------
end;
IMeasureHumidity = interface(IBase)
//----------------------------------------
function MeasureHumidity: double;
//----------------------------------------
end;
Run Code Online (Sandbox Code Playgroud)
我将其中几个接口放入一个TInterfaceList中,然后我想扫描列表中的特定接口类型(例如'IMeasureTemperature'),构建另一个指向导出这些接口的对象的指针列表.我不想对这些对象的位置做任何假设,有些可能会导出多种类型的接口.我知道我可以使用以下类似的类层次结构执行此操作:
If FList[I] is TMeasureTemperature then ..
Run Code Online (Sandbox Code Playgroud)
但是我想用接口类型做一些类似的事情,这可能吗?
只需使用支持,如下所示:
var
oMTIntf: IMeasureTemperature;
...
If Supports(FList[I], IMeasureTemperature, oMTIntf) then ..
Run Code Online (Sandbox Code Playgroud)
我想这可能会满足你的需求。
function InterfaceRefIsInterface(Intf : IUnknown; ExpectedIntf : TGUID) : Boolean;
var vReference : IUnknown;
begin
if Supports(Intf, ExpectedIntf, vReference) then
Result := Intf = vReference
else
Result := False;
end;
Run Code Online (Sandbox Code Playgroud)
我不确定当 Intf 和 ExpectedIntf 相互继承时该函数将如何表现,但在 Intf 与 ExpectedIntf 完全匹配的情况下,这将返回 TRUE。
在您的示例中,IMeasureHumidity 不会在 IMeasureTemperature 上返回 true,但我不确定它将如何对 IBase 做出反应。根据初步测试,在IBase上也会返回FALSE。