我想创建一个通用函数。我是通用的新手。 我有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;
我知道代码没有运行,但是你能告诉我它是否有可能做到这一点?
答案 0 :(得分:3)
只需引入通用参数T
的{{3}}即可。它必须是一个班级。
来自文档:
类型参数可以由零或一个类类型约束。与接口类型约束一样,此声明意味着编译器将要求作为约束类型参数的参数传递的任何具体类型与约束类兼容。 类类型的兼容性遵循OOP类型兼容性的常规规则 - 后代类型可以在需要其祖先类型的地方传递。
将声明更改为:
function yGetFilter<T:class>(iIndice : integer) : T;
更新
似乎在XE5及更早版本中出现编译错误:
E2015运算符不适用于此操作数类型
在这一行:
if T = TFilterEntity then
在XE6及以上版本中,此错误已得到修复。
顺便说一句,就像大卫在评论中说的那样:
if TClass(T) = TFilterEntity then