gpt4 book ai didi

delphi - 使用具有通用接口(interface)类型的 Supports() 函数

转载 作者:行者123 更新时间:2023-12-03 14:41:53 26 4
gpt4 key购买 nike

我刚刚在 Delphi 2009 中第一次尝试使用泛型,并且对如何使用泛型类型作为用于查看对象是否实现给定接口(interface)的 Supports 函数的输入感到困惑。我创建了一个小样本来说明该问题。

给定以下类型和实用函数:

IMyInterface = interface
['{60F37191-5B95-45BC-8C14-76633826889E}']
end;

TMyObject = class(TInterfacedObject, IMyInterface)
end;

class function TFunctions.GetInterface<T>(myObject: TObject): T;
var
specificInterface: T;
begin
// This would compile, but looses the generic capability
//Supports(myObject, IMyInterface, specificInterface);

// This results in compile errors
Supports(myObject, T, specificInterface);

result := specificInterface;
end;

和以下代码片段:

class procedure TFunctions.Test;
var
myObject: TMyObject;
myInterface: IMyInterface;
begin
myObject := TMyObject.Create;

myInterface := GetInterface<IMyInterface>(myObject);
end;

我预计不会出现任何问题,但出现以下编译时错误:

[DCC Error] GenericExample.pas(37): E2029 '(' expected but ',' found [DCC Error] GenericExample.pas(37): E2014 Statement expected, but expression of type 'T' found

当用作函数的实际参数时,我不确定编译器希望我对 T 做什么。

我查了很多资料,但没能破解这个问题。我内心的一部分怀疑,如果我能够理解接口(interface)名称在编译过程中如何转换为 IID: TGUID 类型,那么在使用具体接口(interface)名称时,我可以取得一些进展,但这也让我回避了。

非常感谢任何帮助。

最佳答案

无法保证 T 具有与其关联的 GUID,并且语言中无法编写对类型参数的约束来实现该保证。

编译器在符号表中查找名称,获取表示接口(interface)的编译器数据结构,并检查 GUID 的相应字段,将接口(interface)名称转换为 GUID。但泛型并不像 C++ 模板;它们需要进行编译和类型检查,并知道它们适用于任何有效的类型参数,这意味着在其声明中限制类型参数。

您可以使用 RTTI 获取 GUID(首先检查 T 确实代表接口(interface)),例如 GetTypeData(TypeInfo(T))^.Guid并将 GUID 传递给 Supports就这样。

关于delphi - 使用具有通用接口(interface)类型的 Supports() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4418278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com