我想创建一个泛型函数。我是通用类的新手。
我有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;
我知道该代码不会运行,但是您能告诉我是否有可能执行该操作吗?
最佳答案
只需引入通用参数T
的constraint。它必须是一堂课。
从文档中:
类型参数可能受零个或一个类类型的约束。与接口类型约束一样,此声明意味着编译器将要求任何作为参数传递给约束类型参数的具体类型都必须与约束类兼容。
类类型的兼容性遵循OOP类型兼容性的一般规则-可以在需要其祖先类型的地方传递子孙类型。
将声明更改为:
function yGetFilter<T:class>(iIndice : integer) : T;
更新资料
在XE5和更早版本中,您似乎会遇到编译器错误:
E2015运算符不适用于此操作数类型
在这一行:
if T = TFilterEntity then
在XE6及更高版本中,此错误已修复。
为了规避,请按照David在评论中所说的那样做:
if TClass(T) = TFilterEntity then