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

时间:2010-06-07 18:46:03

标签: delphi interface guid

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

2 个答案:

答案 0 :(得分:19)

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

This page通过以下信息确认:

  

注意:SysUtils单元提供了一个   重载的函数叫做Supports   在课时返回true或false   类型和实例支持a   由a表示的特定接口   GUID。支持功能用于   德尔福的方式是和   运营商。显着的差异   是支持功能可以采取   作为右操作数是GUID还是   与a关联的接口类型   GUID ,而是以及取名   一种类型。有关的更多信息   是和,见,参见类别参考。

这里有一些interesting information about interfaces,其中指出:

  

为什么需要接口   唯一可识别的?答案是   简单:因为Delphi类可以   实现多个接口。当一个   应用程序正在运行,有必要   是一个获得指针的机制   从一个适当的接口   实现。 找到的唯一方法   如果一个对象实现了一个   接口和获取指针   该接口的实现是   通过GUID

两个引号都加入了重点。

阅读整篇文章还会让您意识到QueryInterface(需要GUID)是在幕后使用的,例如引用计数。

答案 1 :(得分:7)

仅当您需要将您的界面设为compatible with COM

不幸的是,这还包括使用isas运算符和QueryInterfaceSupports函数 - 缺乏相应的限制。因此,虽然不是严格要求,但使用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;