如何声明并使用一个泛型记录的泛型TList

3

我想声明一个通用的记录类型,例如

TMyGenericRecord<T, T1> = record
   X: <T>;
   Y: <T1>;
end;

我想声明一个TMyGenericRecord类型的TList,但似乎无法获得正确的语法。

TMyGenericList = TList<TMyGenericRecord<T, T1>>???

这真的可行吗?


1
而你为什么想要这样做,而不使用“TPair”呢? - Warren P
1
@warren 或许真正的代码有三到四个通用参数。 - David Heffernan
@DavidHeffernan 实际上,它确实有几个,我仍在努力确定如何构建结构。在这个示例中没有看到需要使其复杂化。WarrenP 我不知道 TPair,所以感谢您的建议... - A Lombardo
1个回答

8
我认为你想要这样写:

我认为你希望将其写成这样:

type
  TMyGenericRecord<T1, T2> = record
    X: T1;
    Y: T2;
  end;

  TMyGenericList<T1, T2> = class(TList<TMyGenericRecord<T1, T2>>);

例如,您可以像这样实例化类型:
var
  List: TMyGenericList<Integer, string>;

您可以这样声明与此列表兼容的记录:
var
  Rec: TMyGenericRecord<Integer, string>;

在哪个时候(指技术实现过程中)
List.Add(Rec);

将会编译。尽管显然你需要构造一个列表的实例。


谢谢,我刚试了一下,运行得很好。如果您不介意解释一下,在class(TList<TMyGenericList<T1,T2>>)中使用“Class”声明的原因是什么? - A Lombardo
文档(http://docwiki.embarcadero.com/RADStudio/en/Declaring_Generics#Class.2C_Interface.2C_and_Record_Types)列出了可以使用泛型参数声明的类型。您可能希望编写`TMyGenericList<T1, T2> = TList<TMyGenericRecord<T1, T2>>`,但根据文档(以及编译器),这是不可能的。 - David Heffernan
2
我认为另一种表达方式是泛型类型别名是不允许的。 - David Heffernan
1
@user 如果你需要使用IndexOf等方法,请考虑指定一个比较器,因为记录的默认比较器执行原始内存比较,这可能不是你想要的。 - Stefan Glienke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接