【问题标题】:Converting TObjectList ancestor to generic collection in Delphi在 Delphi 中将 TObjectList 祖先转换为通用集合
【发布时间】:2011-11-16 15:24:56
【问题描述】:

我有课

TMyAwesomeList = class(TObjectList)

持有

 TAwesomeItem = class(TPersistent)

TAwesomeItem 几乎是一个抽象类

 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 循环如何工作。
  • 原始 TAwesomeList 中没有太多内容,除了 4 个构造函数,它们使用正确的 TAwesomeItem 类型填充列表,并覆盖了我可以用泛型摆脱的 GetItem/SetItem 方法。是的,我认为它们都可以属于同一类型,最初我在编程时没有考虑到这一点,但从未那样使用它。

标签: delphi list generics delphi-2009


【解决方案1】:

根据您的cmets,您似乎可以直接使用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... 替换我正在使用的构造函数,我想我只是希望有一个神奇的方法来做到这一点,谢谢!跨度>
  • 关于构造函数,现在情况发生了变化:每个项目类型都有一个单独的列表类型。可能会想出一个通用的项目构造函数作为列表的方法。取决于你的代码。
猜你喜欢
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多