亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1760 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條評論
主站蜘蛛池模板: 亚洲国产精品久久精品成人 | 99爱视频精品免视看 | 亚洲国产精品一区二区九九 | 91精品在线免费 | 中中文字幕乱码 | 久久国产精品99国产精 | 欧美大交乱xxxxxbbb | 中文在线日韩 | 爱操影院| 久久综合色婷婷 | 激情综合婷婷亚洲图片 | 精品无码久久久久久国产 | 羞羞视频网站 | 国产一级特黄高清在线大片 | 真人一级毛片免费观看视频 | 国产麻豆之光e奶女教师 | 国产福利观看 | 青青青国产高清免费视频 | bbw下身丰满18ⅹxxⅹ | 国产日韩欧美精品一区二区三区 | 国产精品免费综合一区视频 | 国产精品视频在线观看 | 欧美一级视频在线观看 | 国产精品资源在线观看 | 97国产在线公开免费观看 | 国产精品欧美日韩精品 | 日韩国产午夜一区二区三区 | 欧美一区二区三区精品国产 | 久久精品视屏 | 日韩亚洲精品不卡在线 | 野花成人 | 亚洲欧美日韩国产综合 | 天天曰天天爽 | 色丁香综合 | 日本 国产 欧美 | 精品国产免费福利片 | 国产精品尹人在线观看免费 | 成人a免费视频播放 | 点击进入不卡毛片免费观看 | 亚洲欧美日韩久久一区 | 欧美精品二区 |