首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 2009 泛型進階體驗:泛型陣列、方法、類別、約束條件與特化完整指南

     編輯:Delphi

Delphi 2009 泛型完整能力圖譜

繼基礎容器體驗後,本文深入探討 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: classT 必須為類別型別 (參考型別)✅ 完整支援TList<T: class>
T: TBaseClassT 必須繼承自 TBaseClass✅ 完整支援TList<T: TComponent>
T: constructorT 必須有公開無參建構函數⚠️ 語法支援,但 T.Create 編譯不通TFactory<T: constructor>
T: record / T: Integer值型別約束 / 具體型別參數化❌ 不支援無
T: IInterfaceT 必須實作介面✅ 完整支援TList<T: IComparable>

1. 類別型別約束


type TGenericsClass1<T: class> = class ... end;
var gc1: TGenericsClass1<TObject>;
gc1 := TGenericsClass1<TObject>.Create(nil); // 僅接受類別

2. 具體類別約束 (繼承關係)


type TGenericsClass1<T: TList> = class ... end;
var gc1: TGenericsClass1<TObjectList>; // TObjectList 繼承 TList

3. 建構函數約束


type TGeneric<T: constructor> = class
public constructor Create; virtual; end;
// 理想用法 (編譯不通):
// var t: T; t := T.Create; // 需官方修復

4. 多重約束 (類別 + 介面)


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

5. 多模板型別分別約束


type TGenericsClass<T: class; T1: TList> = class ... end; // 分號分隔

6. 巢狀約束


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*>)。無語法關鍵字對應,亦無編譯器特化行為跡象。可能需等待後續版本或官方文檔確認替代方案。

十一、C# 相似特性:default 關鍵字

Delphi 2009 提供類 C# default(T) 功能:獲取型別預設值 (值型別為 0/False,引用型別為 nil)。

總結

Delphi 2009 泛型系統已具備:泛型型別別名、類別/方法泛型、豐富約束 (類別/繼承/介面/建構函數/多重/巢狀),接近 C# 2.0 水準。主要缺口:無值型別約束、無特化/偏特化、建構函數約束語法與實作脫節。掌握現有能力,已能構建強型別、高復用的泛型庫與框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved