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

Delphi2009初體驗(yàn) - 語(yǔ)言篇 - 體驗(yàn)泛型(二)

系統(tǒng) 2041 0

快速導(dǎo)航

六、 體驗(yàn)泛型數(shù)組

七、 體驗(yàn)泛型方法

八、 體驗(yàn)自定義泛型類

九、 體驗(yàn)泛型約束條件

1、 類類型約束條件

2、 對(duì)象類型約束條件

3、 構(gòu)造函數(shù)約束條件

4、 值類型約束條件

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

7、 嵌套約束條件

十、 關(guān)于特化與偏特化

十一、 總結(jié)


由于正式版還沒有發(fā)出,官方的幫助文檔也沒有泄露,所以我沒有辦法驗(yàn)證 Delphi 對(duì)泛型的支持到何種程度了。大家對(duì)泛型都很熟悉,具體細(xì)節(jié)我就不多說(shuō)了。下面將貼出一些代碼,用來(lái)驗(yàn)證 Delphi 對(duì)泛型的支持并驗(yàn)證是否通過(guò)。

六、體驗(yàn)泛型數(shù)組

<!--<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

七、體驗(yàn)泛型方法

1、Delphi2009不支持全局泛型方法,泛型方法只能置于類內(nèi)或者嵌套在方法內(nèi),或者成為類的靜態(tài)方法。
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初體驗(yàn) - 語(yǔ)言篇 - 體驗(yàn)泛型(二)

八、體驗(yàn)自定義泛型類

<!--<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初體驗(yàn) - 語(yǔ)言篇 - 體驗(yàn)泛型(二)

九、體驗(yàn)泛型約束條件

以下通過(guò)代碼針對(duì)泛型類,對(duì)Delphi2009所支持的泛型約束條件進(jìn)行驗(yàn)證。

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 // 注意在此進(jìn)行約束
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、對(duì)象類型約束條件

約束T只能為某一個(gè)對(duì)象類型

<!--<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 // 注意在此進(jìn)行約束
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、構(gòu)造函數(shù)約束條件

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

在D2009中,我也發(fā)現(xiàn)有這樣的特性:

<!--<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必須擁有可見的構(gòu)造函數(shù)。

但是,我在使用以下代碼時(shí),編譯器總是提示編譯不通過(guò):

<!--<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 ;

獲取是另外一種寫法?我沒有嘗試出來(lái),需要等官方正式版出來(lái)才能確認(rèn)。

4、值類型約束條件

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

5、多約束條件

與C#類似,Delphi2009的多約束條件用來(lái)約束T既滿足一個(gè)類型,又滿足一個(gè)接口。

<!--<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 // 注意在此進(jìn)行約束
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、多模板類型分別約束條件

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

<!--<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 // 注意在此進(jìn)行約束,用“;”將兩個(gè)模板類型分開進(jìn)行分別約束
3 private
4 end ;

7、嵌套約束條件

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

<!--<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 // 注意在此進(jìn)行約束,用“;”將兩個(gè)模板類型分開進(jìn)行分別約束
7 private
8 end ;

十、關(guān)于特化和偏特化

謝謝網(wǎng)友“ 裝配腦袋” 的提醒,我試了很多方法,都沒有跡象表明D2009支持C++中模板的特化和偏特化,或者D2009用其他形式的語(yǔ)法表示特化與偏特化,導(dǎo)致我沒有試驗(yàn)出來(lái)。

十一、總結(jié)

總體上來(lái)說(shuō),D2009從泛型的角度出發(fā),做得已經(jīng)非常不錯(cuò)了,已經(jīng)非常接近C#。甚至,D2009還提供類似于C#的關(guān)鍵字“default”,來(lái)獲取泛型類型T的默認(rèn)值(值類型置0,引用類型為空指針)。

在接下來(lái)的章節(jié)里,我會(huì)向大家介紹D2009的其他新體驗(yàn),如:匿名函數(shù)和反射(比RTTI更強(qiáng)大)的支持。

Delphi2009初體驗(yàn) - 語(yǔ)言篇 - 體驗(yàn)泛型(二)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 黎川县| 九江市| 通许县| 绥江县| 东阿县| 肥西县| 汝城县| 龙门县| 古田县| 长岛县| 澄迈县| 南木林县| 黄平县| 兴安县| 萝北县| 西盟| 吉首市| 五常市| 舞阳县| 锦州市| 周口市| 安顺市| 清苑县| 凤台县| 蒲城县| 赤城县| 石首市| 蒙山县| 岳阳县| 岗巴县| 民丰县| 正定县| 繁峙县| 岱山县| 桦甸市| 无为县| 嵊州市| 台湾省| 田东县| 丹东市| 九龙坡区|