日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Delphi2009初體驗 - 語言篇 - 體驗泛型(二)

系統 1915 0

快速導航

六、 體驗泛型數組

七、 體驗泛型方法

八、 體驗自定義泛型類

九、 體驗泛型約束條件

1、 類類型約束條件

2、 對象類型約束條件

3、 構造函數約束條件

4、 值類型約束條件

5、 多約束條件
6、 多模板類型分別約束條件

7、 嵌套約束條件

十、 關于特化與偏特化

十一、 總結


由于正式版還沒有發出,官方的幫助文檔也沒有泄露,所以我沒有辦法驗證 Delphi 對泛型的支持到何種程度了。大家對泛型都很熟悉,具體細節我就不多說了。下面將貼出一些代碼,用來驗證 Delphi 對泛型的支持并驗證是否通過。

六、體驗泛型數組

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestGenericArray;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils;
7
8 type
9 TArr < T > = array of T;
10
11 var
12 arr:TArr < Integer > ;
13 n:Integer;
14 begin
15 Setlength(arr, 10 );
16
17 for n: = 0 to 9 do
18 begin
19 arr[n]: = n;
20 end ;
21 end .
22

七、體驗泛型方法

1、Delphi2009不支持全局泛型方法,泛型方法只能置于類內或者嵌套在方法內,或者成為類的靜態方法。
2、以下代碼將打印出傳入泛型變量的地址:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestGenericArray;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils;
7
8 type
9 TGeneric = class
10 class procedure PrintAddress < T > (aVal:T);
11 end ;
12
13 var
14 n:Integer;
15
16 { TGeneric }
17
18 class procedure TGeneric.PrintAddress < T > (aVal:T);
19 begin
20 Writeln(Integer(@aVal));
21 end ;
22
23 begin
24 n: = 10 ;
25 TGeneric.PrintAddress < Integer > (n);
26 end .

Delphi2009初體驗 - 語言篇 - 體驗泛型(二)

八、體驗自定義泛型類

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestGenericClass;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils;
7
8 type
9 TGenericsClass1 < T > = class
10 private
11 fValue:T;
12 public
13 constructor Create(aValue:T); virtual ;
14 property Value:T read fValue write fValue;
15 end ;
16
17 var
18 gc1:TGenericsClass1 < Integer > ;
19
20 { TGenericsClass1<T> }
21
22 constructor TGenericsClass1 < T > .Create(aValue:T);
23 begin
24 fValue: = aValue;
25 end ;
26
27 begin
28 gc1: = TGenericsClass1 < Integer > .Create( 10 );
29 Writeln(gc1.Value);
30 FreeAndNil(gc1);
31
32 Readln;
33 end .

Delphi2009初體驗 - 語言篇 - 體驗泛型(二)

九、體驗泛型約束條件

以下通過代碼針對泛型類,對Delphi2009所支持的泛型約束條件進行驗證。

1、類類型約束條件

約束模板類型T只能為類類型

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestGenericClass;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils;
7
8 type
9 TGenericsClass1 < T: class > = class // 注意在此進行約束
10 private
11 fValue:T;
12 public
13 constructor Create(aValue:T); virtual ;
14 property Value:T read fValue write fValue;
15 end ;
16
17 var
18 gc1:TGenericsClass1 < TObject > ;
19
20 { TGenericsClass1<T> }
21
22 constructor TGenericsClass1 < T > .Create(aValue:T);
23 begin
24 fValue: = aValue;
25 end ;
26
27 begin
28 gc1: = TGenericsClass1 < TObject > .Create( nil );
29 Writeln(gc1.Value = nil );
30 FreeAndNil(gc1);
31
32 Readln;
33 end .

2、對象類型約束條件

約束T只能為某一個對象類型

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestGenericArray;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils,
7 Classes,
8 Contnrs;
9
10 type
11 TGenericsClass1 < T:TList > = class // 注意在此進行約束
12 private
13 fValue:T;
14 public
15 constructor Create(aValue:T); virtual ;
16 property Value:T read fValue write fValue;
17 end ;
18
19 var
20 gc1:TGenericsClass1 < TObjectList > ;
21
22 { TGenericsClass1<T> }
23
24 constructor TGenericsClass1 < T > .Create(aValue:T);
25 begin
26 fValue: = aValue;
27 end ;
28
29 begin
30 gc1: = TGenericsClass1 < TObjectList > .Create( nil );
31 Writeln(gc1.Value = nil );
32 FreeAndNil(gc1);
33
34 Readln;
35 end .

3、構造函數約束條件

大家都知道,在C#中,可以使用 T: where new() 對泛型模板類型進行構造函數的約束,指明 類型T 必須有一個可見的構造函數。

在D2009中,我也發現有這樣的特性:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 TGeneric < T: constructor > = class
2 public
3 constructor Create; virtual ;
4 end ;

約束“: constructor”表明T必須擁有可見的構造函數。

但是,我在使用以下代碼時,編譯器總是提示編譯不通過:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 var
2 t:T;
3 begin
4 t: = T.Create;
5 end ;

獲取是另外一種寫法?我沒有嘗試出來,需要等官方正式版出來才能確認。

4、值類型約束條件

Delphi2009的泛型約束不提供值類型約束條件,TGenericsClass1<T: Integer> = class這樣的約束編譯器是不支持的。所以,像c++中template <Tint S> class TBuf這樣的約束在Delphi中行不通。

5、多約束條件

與C#類似,Delphi2009的多約束條件用來約束T既滿足一個類型,又滿足一個接口。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 program TestGenericArray;
2
3 { $APPTYPECONSOLE }
4
5 uses
6 SysUtils,
7 Classes,
8 Windows,
9 Contnrs;
10
11 type
12 IInt = Interface
13 procedure Test;
14 End;
15
16 TImp = class (TInterfacedObject,IInt)
17 public
18 procedure Test;
19 end ;
20
21 TGenericsClass < T: class ,IInt > = class // 注意在此進行約束
22 private
23 fValue:T;
24 public
25 constructor Create(aValue:T); virtual ;
26 property Value:T read fValue write fValue;
27 end ;
28
29 var
30 gc1:TGenericsClass < TImp > ;
31
32 { TGenericsClass<T> }
33
34 constructor TGenericsClass < T > .Create(aValue:T);
35 begin
36 fValue: = aValue;
37 end ;
38
39 { TImp }
40
41 procedure TImp.Test;
42 begin
43
44 end ;
45
46 begin
47 gc1: = TGenericsClass < TImp > .Create( nil );
48 Writeln(gc1.Value = nil );
49 FreeAndNil(gc1);
50
51 Readln;
52 end .

6、多模板類型分別約束條件

有兩個模板類型T1、T2,要使用不同的約束分別約束兩個模板類型,可以使用以下方法:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 type
2 TGenericsClass < T: class ;T1:TList > = class // 注意在此進行約束,用“;”將兩個模板類型分開進行分別約束
3 private
4 end ;

7、嵌套約束條件

Delphi2009的泛型約束條件對嵌套約束條件處理的很好,如:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> 1 TFelix < T > = class
2 public
3
4 end ;
5
6 TGenericsClass < T: class ;T1:TFelix < T >> = class // 注意在此進行約束,用“;”將兩個模板類型分開進行分別約束
7 private
8 end ;

十、關于特化和偏特化

謝謝網友“ 裝配腦袋” 的提醒,我試了很多方法,都沒有跡象表明D2009支持C++中模板的特化和偏特化,或者D2009用其他形式的語法表示特化與偏特化,導致我沒有試驗出來。

十一、總結

總體上來說,D2009從泛型的角度出發,做得已經非常不錯了,已經非常接近C#。甚至,D2009還提供類似于C#的關鍵字“default”,來獲取泛型類型T的默認值(值類型置0,引用類型為空指針)。

在接下來的章節里,我會向大家介紹D2009的其他新體驗,如:匿名函數和反射(比RTTI更強大)的支持。

Delphi2009初體驗 - 語言篇 - 體驗泛型(二)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 英山县| 波密县| 宝鸡市| 灵宝市| 健康| 黑龙江省| 望城县| 调兵山市| 晋州市| 三门县| 阿城市| 若尔盖县| 宁阳县| 永昌县| 庐江县| 克拉玛依市| 交口县| 永川市| 弋阳县| 印江| 巫溪县| 皮山县| 宁远县| 拉孜县| 远安县| 英吉沙县| 章丘市| 年辖:市辖区| 商水县| 大英县| 邓州市| 麻城市| 新建县| 大冶市| 漳州市| 沾化县| 黎川县| 准格尔旗| 屏边| 张家界市| 西乌珠穆沁旗|