我需要了解如何使用通用的Delphi 2009 TObjectList。我的非TObjectList尝试看起来像

TSomeClass = class(TObject)
private
  FList1: Array of TList1;
  FList2: Array of TList2;
public
  procedure FillArray(var List: Array of TList1; Source: TSource); Overload;
  procedure FillArray(var List: Array of TList2; Source: TSource); Overload;
end;


在这里,TList1TList2继承相同的构造函数constructor TParent.Create(Key: string; Value: string);。但是,由于专业化程度不同(例如,不同的私有字段),它们将不是同一类型。因此,我必须编写两个几乎相同的填充方法:

procedure TSomeClass.FillArray(var List: Array of TList1; Source: TSource);
begin
  for i := 0 to Source.List1.Count - 1 do begin
    SetLength(List, Length(List) + 1);
    List[i] := TList1.Create(Source.List1[i].Key, Source.List1[i].Value);
  end;
end;


FillArray(List: Array of TList2; Source: TSource);是相同的,只是通篇将TList1替换为TList2。据我了解,这可以通过使用TObjectList和单一填充方法来规避。但是,我不知道如何进行此操作。有人对此有一些好的建议吗?谢谢!

最佳答案

您将无法通过使用泛型列表来简化这一点,因为泛型的类型是类定义的一部分。因此,TObjectList<TMyClass1>TObjectList<TMyClass2>不同(且不兼容)。与常规TList / TObjectList相比,使用泛型列表的主要好处是提高了类型安全性,并减少了强制类型转换和更简洁的代码。

另外,如果您使用键/值对,是否将它们放入列表中,然后通过搜索键并返回关联的值来检索它们?如果是这样,请查看Generics.Collections中的TDictionary。这是一个通用的键/值哈希表,它将为您大大简化此过程。

关于delphi - Delphi:如何使用TObjectList <T>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1660698/

10-09 09:34