在Delphi中使用接口是否需要GUID?

Ken*_*ran 19 delphi guid interface

官方文档说它们是可选的.我知道COM interop需要每个接口的唯一标识符,但我看到的每个接口示例都有一个GUID,无论它是否与COM一起使用?如果GUID不能与COM一起使用,是否有任何好处?

Sen*_*ful 19

我注意到一些方法,例如Supports(确定一个类是否符合特定接口)要求您在使用之前定义GUID.

此页面使用以下信息确认:

注意:SysUtils单元提供了一个名为Supports的重载函数,当类类型和实例支持由GUID表示的特定接口时,该函数返回true或false.Supports函数以Delphi的方式和作为运算符使用.重要的区别在于Supports函数可以将GUID或与GUID相关联的接口类型作为右操作数,而是采用类型的名称.有关is和as的更多信息,请参阅类引用.

以下是有关接口的一些有趣信息,其中指出:

为什么界面需要唯一标识?答案很简单:因为Delphi类可以实现多个接口.当应用程序运行时,必须有一种机制,它将从实现中获取指向适当接口的指针.查明对象是否实现接口以及获取指向该接口实现的指针的唯一方法是通过GUID.

重点在两个引号中都加入了.

阅读整篇文章还会让您意识到QueryInterface(由于引用计数等原因)在幕后使用(需要GUID).

  • 所以简短的回答是,GUID是可选的,不使用它们限制了你可以用接口做什么. (4认同)
  • "找出对象是否实现接口并获取指向该接口实现的指针的唯一方法是通过GUID." 为什么不只是查询对象的方法并检查以确保对象中存在具有这些名称的方法?好老鸭打字?您在其他语言中看不到此GUID废话. (2认同)

Ond*_*lle 7

仅当您需要您的接口与COM兼容时.

不幸的是,还包括使用is,as运营商和QueryInterface,Supports功能-缺少其中的实在是太有限.因此,虽然不是严格要求,但使用GUID可能更容易.否则,您只能使用相当简单的用法:

type
  ITest = interface
    procedure Test;
  end;

  ITest2 = interface(ITest)
    procedure Test2;
  end;

  TTest = class(TInterfacedObject, ITest, ITest2)
  public
    procedure Test;
    procedure Test2;
  end;

procedure TTest.Test;
begin
  Writeln('Test');
end;

procedure TTest.Test2;
begin
  Writeln('Test2');
end;

procedure DoTest(const Test: ITest);
begin
  Test.Test;
end;

procedure DoTest2(const Test: ITest2);
begin
  Test.Test;
  Test.Test2;
end;

procedure Main;
var
  Test: ITest;
  Test2: ITest2;
begin
  Test := TTest.Create;
  DoTest(Test);
  Test := nil;

  Test2 := TTest.Create;
  DoTest(Test2);
  DoTest2(Test2);
end;
Run Code Online (Sandbox Code Playgroud)