官方文件说它们是可选的。我知道COM interop需要每个接口的唯一标识符,但我看到的每个接口示例都有一个GUID,无论它是否与COM一起使用?如果GUID不能与COM一起使用,是否有任何好处?
答案 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。
不幸的是,这还包括使用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;