unitunit1;
inte***ce
uses
winapi.windows, winapi.messages, system.sysutils, system.variants, system.classes, vcl.graphics,
vcl.controls, vcl.forms, vcl.dialogs;
type
tform1 =
class
(tform)
procedure
formcreate(sender: tobject);
end; tarr=
class
class
procedure
arrayadd(
var arr: tarray;
const
item: t);
end;var
form1: tform1;
implementation
class
procedure
tarr.arrayadd(
var arr: tarray;
const
item: t);
begin
setlength(arr, length(arr)+1);
arr[high(arr)] := item;
end;
//測試
procedure
tform1.formcreate(sender: tobject);
var arr1: tarray<
string
>;
arr2: tarray;
begin
tarr<
string
>.arrayadd(arr1,
'abc'
); tarr.arrayadd(arr2,
123);
showmessagefmt(
'%s,%d'
, [arr1[
0], arr2[
0]]); //abc,123
end;
end.
二、使用泛型結構:
unit
unit1;
inte***ce
uses
winapi.windows, winapi.messages, system.sysutils, system.variants, system.classes, vcl.graphics,
vcl.controls, vcl.forms, vcl.dialogs;
type
tform1 =
class
(tform)
procedure
formcreate(sender: tobject);
end; tarr=
record
//record
class
procedure
arrayadd(
var arr: tarray;
const
item: t);
static
; //結構中的 class 方法必須是 static 的
end;var
form1: tform1;
implementation
class
procedure
tarr.arrayadd(
var arr: tarray;
const
item: t);
begin
setlength(arr, length(arr)+1);
arr[high(arr)] := item;
end;
//測試
procedure
tform1.formcreate(sender: tobject);
var arr1: tarray<
string
>;
arr2: tarray;
begin
tarr<
string
>.arrayadd(arr1,
'abc'
); tarr.arrayadd(arr2,
123);
showmessagefmt(
'%s,%d'
, [arr1[
0], arr2[
0]]); //abc,123
end;
end.
三、在類或結構中建立泛型方法:
unit
unit1;
inte***ce
uses
winapi.windows, winapi.messages, system.sysutils, system.variants, system.classes, vcl.graphics,
vcl.controls, vcl.forms, vcl.dialogs;
type
tform1 =
class
(tform)
procedure
formcreate(sender: tobject);
end; tarr =
record
class
procedure
arrayadd(
var arr: tarray;
const
item: t);
static;
end;
var form1: tform1;
implementation
class
procedure
tarr.arrayadd(
var arr: tarray;
const
item: t);
begin
setlength(arr, length(arr)+1);
arr[high(arr)] := item;
end;
//測試
procedure
tform1.formcreate(sender: tobject);
var arr1: tarray<
string
>;
arr2: tarray;
begin
tarr.arrayadd<
string
>(arr1,
'abc'
); tarr.arrayadd(arr2,
123);
showmessagefmt(
'%s,%d'
, [arr1[
0], arr2[
0]]); //abc,123
end;
end.
四、擴充 system.generics.collections 單元中的 tarray 類:
unit
unit1;
inte***ce
uses
winapi.windows, winapi.messages, system.sysutils, system.variants, system.classes, vcl.graphics,
vcl.controls, vcl.forms, vcl.dialogs, system.generics.collections;
type
tform1 =
class
(tform)
procedure
formcreate(sender: tobject);
end; t*** =
class
helper
for tarray
class
procedure
arrayadd(
var arr: tarray;
const
item: t);
static;
end;
var form1: tform1;
implementation
class
procedure
t***.arrayadd(
var arr: tarray;
const
item: t);
begin
setlength(arr, length(arr)+1);
arr[high(arr)] := item;
end;
//測試
procedure
tform1.formcreate(sender: tobject);
var arr1: tarray<
string
>;
arr2: tarray;
begin
tarray.arrayadd<
string
>(arr1,
'abc'
); tarray.arrayadd(arr2,
123);
showmessagefmt(
'%s,%d'
, [arr1[
0], arr2[
0]]); //abc,123
end;
end.
總結:1、delphi 的泛型方法只能屬於乙個類或結構, 這是好事, 也應該是 delphi 所提倡的; 這便於管理、也便於快速輸入.
2、稍稍擴充一下就可讓動態陣列和其它強大的列表模擬拼一下了.
3、這也像是 c++ 中的演算法了, 按這個思路應該可以把許多 c++ 中的演算法移植過來.
泛型的使用
泛型是什麼,為什麼使用泛型 泛型是指宣告時不指定型別,使用時指定型別,用編譯時用來宣告型別,使用時指定型別。這就意味著意味著編寫的 可以被不同型別的物件所重用。在集合中如果使用object型別,那麼在使用過程中我們需要進行強制轉換型別,並且在編譯過程中不能夠進行型別轉換檢查異常。這樣就會容易在執行過...
泛型的使用
目前這個專案使用的jsp servlet j abean,沒有使用其它的框架。在處理資料庫的時候,多張表就對應多個dao,而每個dao都有增刪改查的方法,顯得很冗餘。於是寫了乙個commondao,其中包含了其他dao裡面共有的一些方法。然後讓其他的dao類繼承commondao,servlet中直...
泛型的使用
型別引數t 泛型的型別引數t可以看作是乙個佔位符,它不是一種型別,它僅代表了某種可能的型別。型別引數t可以在使用時用任何型別來代替。型別引數t的命名準則如下 使用描述性名稱命名泛型型別引數,除非單個字母名稱完全可以讓人了解它表示的含義,而描述性名稱不會有更多的意義。public inte ce is...