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

delphi – 使用具有通用接口类型的Supports()函数,第1张

概述我刚刚尝试在Delphi 2009中首次使用泛型,并且对如何使用泛型类型作为Supports函数的输入感到困惑,该函数用于查看对象是否实现了给定的接口.我已经创建了一个小样本来说明问题. 给出以下类型和效用函数: IMyInterface = interface['{60F37191-5B95-45BC-8C14-76633826889E}']end;TMyObject = class(T 我刚刚尝试在Delphi 2009中首次使用泛型,并且对如何使用泛型类型作为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做什么.

我搜索了很多,并没有能够破解这一个.我的一部分怀疑如果我能理解在编译期间接口名称如何转换为IID:TGUID类型,当使用具体的接口名称时,我可以取得一些进展,但这也避开了我.

任何帮助深表感谢.

解决方法 无法保证T具有与之关联的GUID,并且语言中没有任何方法可以在类型参数上写入约束来进行保证.

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

您可以使用RTTI(首先检查T确实代表一个接口)获取GUID,例如GetTypeData(TypeInfo(T))^.GuID并将GUID传递给支持.

总结

以上是内存溢出为你收集整理的delphi – 使用具有通用接口类型的Supports()函数全部内容,希望文章能够帮你解决delphi – 使用具有通用接口类型的Supports()函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1279335.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存