【问题标题】:Delphi Generics methodDelphi 泛型方法
【发布时间】:2015-03-31 05:21:26
【问题描述】:

我正在使用泛型来定义一个对象列表,这些对象本身包含泛型列表。我已经编写了一种方法,用于使用基本上执行相同操作的特定方法来检索每个列表的聚合。下面是结构:

unit Unit1;

interface

uses
 System.Generics.Collections;

type
  TListType=(ltSType,ltFType);

  TMyList<T> = class(TList<T>)
   {Do some stuff in here to help load lists etc}
  end;

  TListObject=class(TObject)
  private
    FSList:TMyList<string>;
    FIList:TMyList<integer>;
    function GetSList: TMyList<string>;
    function GetIList: TMyList<integer>;
  public
    property MySList:TMyList<string> read GetSList;
    property MyIList:TMyList<integer> read GetIList;
    constructor create;
  end;

  TListOfObject<T:TListObject> = class(TObjectList<T>)
  public
    Function AggrSList:TMyList<string>;
    Function AggrIList:TMyList<integer>;
  end;

implementation

{ TListObject }

constructor TListObject.create;
begin
  FSList:=TMyList<string>.create;
  FIList:=TMyList<integer>.create;
end;

function TListObject.GetIList: TMyList<integer>;
begin
  result:=FIlist;
end;

function TListObject.GetSList: TMyList<string>;
begin
  result:=FSList;
end;


{ TListOfObject<T> }

function TListOfObject<T>.AggrIList: TMyList<integer>;
var
  i,j:integer;

begin
  result:=TMyList<integer>.create;
  for I := 0 to count-1 do
    for j := 0 to items[i].MyIList.Count-1 do
      result.Add(items[i].MyIList[j]);
end;

function TListOfObject<T>.AggrSList: TMyList<string>;
var
  i,j:integer;
begin
  result:=TMyList<string>.create;
  for I := 0 to count-1 do
    for j := 0 to items[i].MySList.Count-1 do
      result.Add(items[i].MySList[j]);
end;

end.

我对泛型还很陌生,但我觉得聚合方法 AggrIList 和 AggrSlist 可以使用泛型编写,使用单一方法提取数据,然后将其转换为结果。

这可能吗?我将如何处理?我计划做一些更高级的功能,这些功能也会从这种方法中受益。

【问题讨论】:

标签: delphi generics


【解决方案1】:

你可以使用(伪代码):

TNestedList<T> = class(TList<TList<T>>)
  function GetAggregateList : TList<T>;
end;

function TNestedList<T>.GetAggregateList : TList<T>;

var
  List : TList<T>;
  Item : T;

begin
  Result := TList<T>.Create;
  for List in Self do
    for Item in List do
      Result.Add(Item);
  end;

无需为特定类型实现 GetAggregateList - 这就是您使用泛型的目的。

另请注意,最好调用您的方法CreateAggregateList(以明确调用者负责销毁创建的列表)或将已创建的列表实例传递给过程:

procedure GetAggregateList(List : TList<T>);

...将列表所有权完全留给调用者,这是 Delphi 中相当常见的模式。

【讨论】:

  • 谢谢,我认为这种方法会很好。我必须做一些递归操作,这在这种类型的结构中是可以的。
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多