3

我有两个接口,一个来自另一个接口:

type
  ISomeInterface = interface
    ['{5A46CC3C-353A-495A-BA89-48646C4E5A75}']
  end;

  ISomeInterfaceChild = interface(ISomeInterface)
    ['{F64B7E32-B182-4C70-A5B5-72BAA92AAADE}']
  end;

现在我有一个参数是 ISomeInterface 的过程,例如:

procedure DoSomething(SomeInterface: ISomeInterface);

我想检查 SomeInterface 是否是 ISomeInterfaceChild。IsDelphi 7 的接口不支持运算符,我也不能Supports在这里使用。我能做些什么?

4

2 回答 2

5

您确实可以使用Supports. 所有你需要的是:

Supports(SomeInterface, ISomeInterfaceChild)

该程序说明:

program SupportsDemo;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  ISomeInterface = interface
    ['{5A46CC3C-353A-495A-BA89-48646C4E5A75}']
  end;

  ISomeInterfaceChild = interface(ISomeInterface)
    ['{F64B7E32-B182-4C70-A5B5-72BAA92AAADE}']
  end;

procedure Test(Intf: ISomeInterface);
begin
  Writeln(BoolToStr(Supports(Intf, ISomeInterfaceChild), True));
end;

type
  TSomeInterfaceImpl = class(TInterfacedObject, ISomeInterface);
  TSomeInterfaceChildImpl = class(TInterfacedObject, ISomeInterface, ISomeInterfaceChild);

begin
  Test(TSomeInterfaceImpl.Create);
  Test(TSomeInterfaceChildImpl.Create);
  Readln;
end.

输出

错误的
真的
于 2013-05-22T07:59:38.387 回答
4

为什么你说你不能使用这个Supports功能?这似乎是解决方案,它有一个重载版本,它IInterface作为第一个参数,所以

procedure DoSomething(SomeInterface: ISomeInterface);
var tmp: ISomeInterfaceChild;
begin
  if(Supports(SomeInterface, ISomeInterfaceChild, tmp))then begin
     // argument is ISomeInterfaceChild
  end;

应该做你想做的。

于 2013-05-22T07:59:58.853 回答