程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi2009初體驗 - 語言篇 - 體驗泛型(二)(4)

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

編輯:Delphi

3、構造函數約束條件

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

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

1TGeneric<T: constructor> = class
2public
3  constructor Create; virtual;
4end;

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

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

1var
2  t: T;
3begin
4  t := T.Create;
5end;

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

4、值類型約束條件

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

5、多約束條件

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

1program TestGenericArray;
2
3{$APPTYPE CONSOLE}
4
5uses
6  SysUtils,
7  Classes,
8  Windows,
9  Contnrs;
10
11type
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
29var
30  gc1: TGenericsClass<TImp>;
31
32{ TGenericsClass<T> }
33
34constructor TGenericsClass<T>.Create(aValue: T);
35begin
36  fValue := aValue;
37end;
38
39{ TImp }
40
41procedure TImp.Test;
42begin
43
44end;
45
46begin
47  gc1 := TGenericsClass<TImp>.Create(nil);
48  Writeln(gc1.Value = nil);
49  FreeAndNil(gc1);
50
51  Readln;
52end.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved