【发布时间】:2011-02-28 20:22:21
【问题描述】:
官方文档说它们是可选的。我知道 COM 互操作需要每个接口的唯一标识符,但我看到的每个接口示例都有一个 GUID,无论它是否与 COM 一起使用?如果 GUID 不与 COM 一起使用,包含 GUID 有什么好处吗?
【问题讨论】:
官方文档说它们是可选的。我知道 COM 互操作需要每个接口的唯一标识符,但我看到的每个接口示例都有一个 GUID,无论它是否与 COM 一起使用?如果 GUID 不与 COM 一起使用,包含 GUID 有什么好处吗?
【问题讨论】:
仅当您需要您的界面为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;
【讨论】:
ITest 没有子类型关系的IFoo。假设实现类型支持两者,您如何将 ITest 的引用转换为 IFoo 的引用。您需要 GUID 才能安全地执行此操作。
我注意到某些方法,例如Supports(用于确定类是否符合特定接口)要求您先定义 GUID,然后才能使用它们。
This page 用以下信息确认:
注意:SysUtils 单元提供了一个 称为 Supports 的重载 函数 上课时返回真或假 类型和实例支持 由 a 表示的特定接口 GUID。 Supports 函数用于 德尔福的方式是 运营商。显着差异 是支持功能可以采取 作为正确的操作数 GUID 或 与 a 关联的接口类型 GUID,而 is 和 as 取名称 一种类型。有关更多信息 is 和 as,请参阅类引用。
这里有一些interesting information about interfaces,其中指出:
为什么需要一个接口 唯一可识别?答案是 简单:因为 Delphi 类可以 实现多个接口。当一个 应用程序正在运行,必须 成为一种将获得指针的机制 从一个适当的接口 执行。 找到的唯一方法 如果一个对象实现了一个 接口并获取指向的指针 该接口的实现是 通过 GUID。
强调在两个引号中。
阅读整篇文章还会让您意识到,QueryInterface(需要 GUID)在幕后使用是出于引用计数等原因。
【讨论】:
is 或 as 强制转换涉及其中一个调用(我忘记了),所以你需要一个 GUID也这样做。
Supports 函数是迄今为止我为接口定义 GUID 的唯一原因。