我想创建一个泛型函数。我是通用类的新手。
我有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;


我知道该代码不会运行,但是您能告诉我是否有可能执行该操作吗?

最佳答案

只需引入通用参数Tconstraint。它必须是一堂课。

从文档中:


  类型参数可能受零个或一个类类型的约束。与接口类型约束一样,此声明意味着编译器将要求任何作为参数传递给约束类型参数的具体类型都必须与约束类兼容。
  类类型的兼容性遵循OOP类型兼容性的一般规则-可以在需要其祖先类型的地方传递子孙类型。


将声明更改为:

function yGetFilter<T:class>(iIndice : integer) : T;




更新资料

在XE5和更早版本中,您似乎会遇到编译器错误:


  E2015运算符不适用于此操作数类型


在这一行:

if T = TFilterEntity then


在XE6及更高版本中,此错误已修复。

为了规避,请按照David在评论中所说的那样做:

if TClass(T) = TFilterEntity then

10-05 22:13