将不同泛型类型的对象放在一起

时间:2009-07-30 10:48:05

标签: delphi generics delphi-2009

给定泛型类型

TMyClass <T> = class
  ...
end;

有没有办法将多个实例(用不同类型实例化)放在一起,如

FList : TList <TMyClass>;
FList.Add (TMyClass <Integer>.Create);
FList.Add (TMyClass <String>.Create);

FArray : array [0..1] of TMyClass;
FArray [0] := TMyClass <Integer>.Create;
FArray [1] := TMyClass <String>.Create;

我知道这段代码不能编译。但是有可能实现这样的目标吗?

2 个答案:

答案 0 :(得分:3)

如果使用TMyClass的祖先创建FList,则可以这样做。

泛型不是继承,因此TMyClass不是TMyClass的祖先。

TMyAbstractClass = class
TMyClass <T> = class (TMyAbstractClass)
  ...
end;

FList : TList <TMyAbstractClass>;
FList.Add (TMyClass <Integer>.Create);
FList.Add (TMyClass <String>.Create);

FArray : array [0..1] of TMyAbstractClass;
FArray [0] := TMyClass <Integer>.Create;
FArray [1] := TMyClass <String>.Create;

答案 1 :(得分:1)

一个选项是为TMyClass创建一个非泛型基类,其中包含所有未引用T的位。然后创建一个TList<TMyNonGenericBaseClass>并添加实例那个。当然,当你再次拿出它们时,你不知道完整的具体类型是什么,但可能对你来说不是问题。