在Delphi中将TObjectList祖先转换为泛型集合

3
我有一个类
TMyAwesomeList = class(TObjectList)

这个容器包含了

 TAwesomeItem = class(TPersistent)
是一个抽象类,主要用于…
 TAwesomeItem1 = class(TAwesomeItem)
 TAwesomeItem2 = class(TAwesomeItem)
 TAwesomeItem3 = class(TAwesomeItem)
 TAwesomeItem3a = class(TAwesomeItem3)

我实现了一种对象关系建模技术,涉及大约30个子类和一些中间抽象类,用于预期将从Delphi 7转换到2009(并很快转换为XE2)。

该代码在Delphi 2009中仍然可以工作,但我想要进行一次

 for AwesomeItem3a in AwesomeList do
 begin     
    //something awesome
 end;

我不知道如何重构TMyAwesomeList(或添加多个子类)以使其正常工作。


列表是否是同质的,即所有项目都是相同的具体类型?如果是这样,您可以只使用 type TMyAwesomeList1 = TObjectList<TMyAwesomeItem1>; TMyAwesomeList2 = TObjectList<TMyAwesomeItem2>; 等。否则,您需要指定您期望 for ... in 循环如何工作。 - Ondrej Kelle
原始的TAwesomeList中没有太多内容,只有4个构造函数,用于使用正确的TAwesomeItem类型填充列表,并且重写了GetItem/SetItem方法,我可以通过泛型来摆脱它们。是的,我认为它们都可以是相同的类型,最初我编写时没有考虑到这一点,但从未以那种方式使用过它。 - Peter Turner
1个回答

7
根据您的评论,看起来您可以直接使用 TObjectList
var
  MyAwesomeList1: TObjectList<TMyAwesomeItem1>;
  MyAwesomeItem1: TMyAwesomeItem1;
begin
  MyAwesomeList1 := TObjectList<TMyAwesomeItem1>.Create;
  try
    // populate the list...

    for MyAwesomeItem1 in MyAwesomeList1 do
      ...
  finally
    MyAwesomeList1.Free;
  end;
end;

...同样适用于TMyAwesomeItem2等内容,如果你愿意,也可以声明一个类型别名:

type
  TMyAwesomeList1 = TObjectList<TMyAwesomeItem1>;
  TMyAwesomeList2 = TObjectList<TMyAwesomeItem2>;
  // etc.

这可能是正确的,我需要做的唯一一件事就是用“// populate the list…”替换我使用的构造函数,我想我只是希望有一个神奇的方法来做到这一点,谢谢! - Peter Turner
关于构造函数,现在情况已经发生改变:每种项目类型都有一个单独的列表类型。可能可以想出一个通用的项目构造函数,作为列表的方法。这取决于你的代码。 - Ondrej Kelle

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