2011-11-16 78 views
3
转换TObjectList祖先泛型集合

我有一类在Delphi

TMyAwesomeList = class(TObjectList) 

持有

TAwesomeItem = class(TPersistent) 

其中TAwesomeItem是相当多的

TAwesomeItem1 = class(TAwesomeItem) 
TAwesomeItem2 = class(TAwesomeItem) 
TAwesomeItem3 = class(TAwesomeItem) 
TAwesomeItem3a = class(TAwesomeItem3) 

和抽象类等等(大约30个有少量中间抽象类的子类)完成某些对象关联nal建模我在一年前实施,预计最终将从Delphi 7转换到2009年(不久将推出XE2)。

的代码仍然工作在2009年德尔福,但我想做一个

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

,我不知道如何去重组TMyAwesomeList(或增加几个子类),使这项工作。

+0

是名单均匀,即得。所有项目都是相同的具体类型?如果是这样,你可以使用'type TMyAwesomeList1 = TObjectList ; TMyAwesomeList2 = TObjectList ;'等。否则,您需要指定您希望'for ... in'循环的工作方式。 –

+0

原始TAwesomeList中没有太多东西,除了4个构造函数使用正确的TAwesomeItem类型填充列表并覆盖了我可以用泛型消除的GetItem/SetItem方法。是的,我认为它们都可以是相同的类型,最初我没有记住它的编程,但从来没有这样用过。 –

回答

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. 
+0

这可能是正确的,我需要做的唯一事情就是用'//填充列表...'替换我正在使用的构造函数,我想我只是希望有一种神奇的方式来做到这一点,谢谢! –

+0

关于构造函数,情况现在已经发生变化:每个项目类型都有单独的列表类型。作为列表的一种方法,可能会想出一个通用的项目构造函数。取决于你的代码。 –