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).
仅当您需要您的接口与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)