快速導航
六、 體驗泛型數組
七、
體驗泛型方法
八、
體驗自定義泛型類
九、 體驗泛型約束條件
1、 類類型約束條件
2、 對象類型約束條件
3、 構造函數約束條件
4、 值類型約束條件
5、 多約束條件
6、 多模板類型分別約束條件7、 嵌套約束條件
十、 關于特化與偏特化
十一、
總結
由于正式版還沒有發出,官方的幫助文檔也沒有泄露,所以我沒有辦法驗證
Delphi
對泛型的支持到何種程度了。大家對泛型都很熟悉,具體細節我就不多說了。下面將貼出一些代碼,用來驗證
Delphi
對泛型的支持并驗證是否通過。
六、體驗泛型數組

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

八、體驗自定義泛型類

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

九、體驗泛型約束條件
以下通過代碼針對泛型類,對Delphi2009所支持的泛型約束條件進行驗證。
1、類類型約束條件
約束模板類型T只能為類類型

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

2、對象類型約束條件
約束T只能為某一個對象類型

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

3、構造函數約束條件
大家都知道,在C#中,可以使用 T: where new() 對泛型模板類型進行構造函數的約束,指明 類型T 必須有一個可見的構造函數。
在D2009中,我也發現有這樣的特性:

2

3

4

約束“: constructor”表明T必須擁有可見的構造函數。
但是,我在使用以下代碼時,編譯器總是提示編譯不通過:

2

3

4

5

獲取是另外一種寫法?我沒有嘗試出來,需要等官方正式版出來才能確認。
4、值類型約束條件
Delphi2009的泛型約束不提供值類型約束條件,TGenericsClass1<T: Integer> = class這樣的約束編譯器是不支持的。所以,像c++中template <Tint S> class TBuf這樣的約束在Delphi中行不通。
5、多約束條件
與C#類似,Delphi2009的多約束條件用來約束T既滿足一個類型,又滿足一個接口。

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

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

2

3

4

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

2

3

4

5

6

7

8

十、關于特化和偏特化
謝謝網友“ 裝配腦袋” 的提醒,我試了很多方法,都沒有跡象表明D2009支持C++中模板的特化和偏特化,或者D2009用其他形式的語法表示特化與偏特化,導致我沒有試驗出來。
十一、總結
總體上來說,D2009從泛型的角度出發,做得已經非常不錯了,已經非常接近C#。甚至,D2009還提供類似于C#的關鍵字“default”,來獲取泛型類型T的默認值(值類型置0,引用類型為空指針)。
在接下來的章節里,我會向大家介紹D2009的其他新體驗,如:匿名函數和反射(比RTTI更強大)的支持。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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