Delphi函数通用

Joc*_*c02 5 delphi generics function

我想创建一个通用函数。我是通用的新手。我有 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;
Run Code Online (Sandbox Code Playgroud)

我知道该代码无法运行,但是您能告诉我是否可以执行该操作吗?

LU *_* RD 3

只需引入通用参数的约束T即可。它必须是一个类。

从文档中:

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

将声明更改为:

function yGetFilter<T:class>(iIndice : integer) : T;
Run Code Online (Sandbox Code Playgroud)

更新

看来在 XE5 及更早版本中您会收到编译器错误:

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

在这一行:

if T = TFilterEntity then
Run Code Online (Sandbox Code Playgroud)

在 XE6 及以上版本中此错误已修复。

要规避,请按照大卫在评论中所说的那样:

if TClass(T) = TFilterEntity then
Run Code Online (Sandbox Code Playgroud)