我想创建一个通用函数。我是通用的新手。
我有 3 个不同类型的私人列表。我想要一个公共通用方法来返回列表中的 1 项。
我有下面的代码。 (我已经简化了)
TFilter = class
private
FListFilter : TObjectList<TFilterEntity>;
FListFilterDate : TObjectList<TFilterDate>;
FListFilterRensParam : TObjectList<TFilterRensParam>;
public
function yGetFilter<T>(iIndice : integer) : T;
....
function TFilter .yGetFilter<T>(iIndice : integer) : T;
begin
if T = TFilterEntity then
result := T(FListFilter.Items[iIndice])
else
....
end;
我知道该代码无法运行,但是您能告诉我是否可以执行该操作吗?
简单介绍一个约束 http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics#Class_Type_Constraints通用参数的T
。它必须是一个类。
从文档中:
类型参数可以受零个或一个类类型的约束。与接口类型约束一样,此声明意味着编译器将要求作为参数传递给受约束类型参数的任何具体类型与约束类的赋值兼容。
类类型的兼容性遵循 OOP 类型兼容性的正常规则 - 可以在需要祖先类型的地方传递后代类型。
将声明更改为:
function yGetFilter<T:class>(iIndice : integer) : T;
Update
看来在 XE5 及更早版本中您会收到编译器错误:
E2015 运算符不适用于该操作数类型
在这一行:
if T = TFilterEntity then
在 XE6 及以上版本中此错误已修复。
要规避,请按照大卫在评论中所说的那样:
if TClass(T) = TFilterEntity then
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)