2015-03-31 76 views
-1

我正在使用泛型來定義自己擁有通用列表的對象列表。我已經編寫了一種方法,使用基本上執行相同操作的特定方法來檢索每個列表的聚合。下面是結構:德爾福泛型方法

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可以使用,使用一個單一的方法來提取數據,然後澆鑄在結果泛型來寫。

這是可能的,我將如何處理?我打算做一些更高級的功能,以便從這種方法中受益。

+0

檢查文檔... http://docwiki.embarcadero.com/CodeExamples/XE7/en/Generics_Collections_TObjectList_(Delphi)。 你可以使用TObjectList ,你不需要像在你的例子中那樣困難。 或者你可以使用簡單的TList與記錄... http://stackoverflow.com/questions/5797368/delphi-tlist-of-records。 – smooty86 2015-03-31 06:40:28

回答

0

可以使用(僞):

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中是相當普遍的模式。

+0

謝謝,我認爲這種方法會很好。我必須做一些遞歸操作,在這種類型的結構中可以。 – cheechaway 2015-04-01 01:59:48