Delphi 泛型方法
Delphi Generics method
我正在使用泛型来定义一个对象列表,这些对象本身包含泛型列表。我已经编写了一种方法,用于使用基本上执行相同操作的特定方法来检索每个列表的聚合。以下是结构:
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 可以使用泛型来编写,这些泛型使用单一方法提取数据,然后转换为结果。
这可能吗?我该如何处理?我计划做一些更高级的功能,这些功能也会从这种方法中受益。
你可以使用(伪代码):
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.
中是一种很常见的模式
我正在使用泛型来定义一个对象列表,这些对象本身包含泛型列表。我已经编写了一种方法,用于使用基本上执行相同操作的特定方法来检索每个列表的聚合。以下是结构:
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 可以使用泛型来编写,这些泛型使用单一方法提取数据,然后转换为结果。
这可能吗?我该如何处理?我计划做一些更高级的功能,这些功能也会从这种方法中受益。
你可以使用(伪代码):
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.
中是一种很常见的模式