繼基礎容器體驗後,本文深入探討 Delphi 2009 泛型系統的進階特性:泛型陣列、泛型方法、自訂泛型類、完整約束條件體系、特化/偏特化支援現況。
Delphi 支援泛型動態陣列型別別名:
type TArr<T> = array of T;
var arr: TArr<Integer>;
begin
SetLength(arr, 10);
for n := 0 to 9 do arr[n] := n;
end;
本質是語法糖,編譯期展開為具體動態陣列。
限制:不支援全域泛型函數,只能定義在類別內 (實例/靜態/類方法) 或巢狀函數中。
type TGeneric = class
class procedure PrintAddress<T>(aVal: T);
end;
class procedure TGeneric.PrintAddress<T>(aVal: T);
begin Writeln(Integer(@aVal)); end;
// 呼叫
TGeneric.PrintAddress<Integer>(10);
type TGenericsClass1<T> = class
private fValue: T;
public constructor Create(aValue: T);
property Value: T read fValue write fValue;
end;
var gc1: TGenericsClass1<Integer>;
gc1 := TGenericsClass1<Integer>.Create(10);
Writeln(gc1.Value); // 10
| 約束語法 | 含義 | 支援狀態 | 範例 |
|---|---|---|---|
T: class | T 必須為類別型別 (參考型別) | ✅ 完整支援 | TList<T: class> |
T: TBaseClass | T 必須繼承自 TBaseClass | ✅ 完整支援 | TList<T: TComponent> |
T: constructor | T 必須有公開無參建構函數 | ⚠️ 語法支援,但 T.Create 編譯不通 | TFactory<T: constructor> |
T: record / T: Integer | 值型別約束 / 具體型別參數化 | ❌ 不支援 | 無 |
T: IInterface | T 必須實作介面 | ✅ 完整支援 | TList<T: IComparable> |
type TGenericsClass1<T: class> = class ... end;
var gc1: TGenericsClass1<TObject>;
gc1 := TGenericsClass1<TObject>.Create(nil); // 僅接受類別
type TGenericsClass1<T: TList> = class ... end;
var gc1: TGenericsClass1<TObjectList>; // TObjectList 繼承 TList
type TGeneric<T: constructor> = class
public constructor Create; virtual; end;
// 理想用法 (編譯不通):
// var t: T; t := T.Create; // 需官方修復
type IInt = interface procedure Test; end;
type TImp = class(TInterfacedObject, IInt) procedure Test; end;
type TGenericsClass<T: class, IInt> = class ... end; // T 必須是類別且實作 IInt
var gc1: TGenericsClass<TImp>;
type TGenericsClass<T: class; T1: TList> = class ... end; // 分號分隔
type TFelix<T> = class end;
type TGenericsClass<T: class; T1: TFelix<T>> = class ... end; // T1 依賴 T
現況:經測試,Delphi 2009 不支援 C++ 風格的模板特化 (template<> class T<int>) 或偏特化 (template<T> class T<T*>)。無語法關鍵字對應,亦無編譯器特化行為跡象。可能需等待後續版本或官方文檔確認替代方案。
Delphi 2009 提供類 C# default(T) 功能:獲取型別預設值 (值型別為 0/False,引用型別為 nil)。
Delphi 2009 泛型系統已具備:泛型型別別名、類別/方法泛型、豐富約束 (類別/繼承/介面/建構函數/多重/巢狀),接近 C# 2.0 水準。主要缺口:無值型別約束、無特化/偏特化、建構函數約束語法與實作脫節。掌握現有能力,已能構建強型別、高復用的泛型庫與框架。