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.