Translate

2016/08/19

泛型(Generic)容器的小技巧

泛型 (Generic) 是程式毒藥還是解藥? 圖片來源

在Delphi 2009開始便加入了【泛型容器】相關類別,如下所列:

  • TList,TObjectList
  • TQueue,TObjectQueue
  • TStack,TObjectStack
  • TDictionary,TObjectDictionary

不過也只知道可以放像是「string, Integer, TComponent」等,基本型別或是物件都可以自由宣告使用。

乍看下和 TStringList 重疊率很高啊,如果是宣告TList,居然不能使用以下的函式:
  • CommaText
  • DelimitedText 

不能用這兩個常用率特高的函式感覺很廢啊。泛型容器到底有什麼好用的?

一直到需要放置物件時,才開始覺得泛型容器超好用。





以往設計放置物件的容器時,大致上會這麼寫:
  • Array of TComponent
  • TStringList

Array of TComponent:
除了SetLength外,還要自己做釋放物件的工作,有夠麻煩。

TStringList:
TStringList也可以放物件?
有的,可以這麼寫
函式如下:
function AddObject(const S: string; AObject: TObject): Integer; override;

就可以利用函式裡的【TObject】來存放基本型別或是任何物件。
只是取出還得用 IndexOf和物件轉型就很麻煩,比方說:
if PersonList.IndexOf('Mary') > 0 then
  TPerson(PersonList.Object(PersonList.indexOf('Mary')));




















你不累嗎?看得都累了……


這時泛型物件可以這樣寫:
var
  PersonList: TObjectList<TPerson>
begin
  PersonList:= TObjectList<TPerson>.Create;
 
  PersonList.Add(TPerson.Create);
  PersonList[0].Name := 'Mary';

  FreeAndNil(PersonList);
end;

不用轉型,程式碼方便易懂。您說是吧! ^ ^

沒有留言:

張貼留言

DataSnap REST + JS framework = full stack development (CHT)

ExpressWeb Framework, IntraWeb, UniGUI, Raudus, Elevate Web Builder, Kitto, Delphi MVC Framework... Delphi 這麼多 Web Solution 中,你用過哪幾種? ...