在 Delphi 開發中,當兩個類別互相引用對方的類型時(例如類別 A 包含類別 B 的欄位,而類別 B 也包含類別 A 的欄位),編譯器會因為「尚未定義」而報錯。這就是經典的循環依賴問題。Delphi 提供前向宣告機制,讓我們先告訴編譯器「這個類別存在」,稍後再補上完整定義,從而打破編譯順序的限制。
請看下面的錯誤範例:TClassA 試圖使用尚未定義的 TClassB 作為欄位類型。
// 錯誤範例:TClassB 尚未定義
TClassA = class
Field1: string;
Field2: Integer;
Field3: TClassB; // 編譯錯誤:Unknown identifier 'TClassB'
end;
TClassB = class
Field1: string;
Field2: Integer;
end;
編譯器自上而下讀取程式碼,當處理 TClassA 時,TClassB 尚未出現,因此無法辨識其類型。
只需在完整定義之前,加上一行 TClassB = class; 即可。這告訴編譯器:TClassB 是一個類別類型,稍後會完整定義。
// 正確範例:使用前向宣告
TClassB = class; // 前向宣告
TClassA = class
Field1: string;
Field2: Integer;
Field3: TClassB; // 現在合法了
end;
TClassB = class // 完整定義
Field1: string;
Field2: Integer;
end;
class,不適用於記錄、介面或基本類型。type 區塊中。常見於「父子關係」或「雙向關聯」的資料模型,例如:
TTreeNode 持有 Parent: TTreeNode 與 Children: TList<TTreeNode>)前向宣告是 Delphi 解決類別循環引用的標準手法,語法簡潔(TypeName = class;),能有效解決編譯順序衝突。善用此技巧,配合良好的架構分層,可編寫出更靈活、可維護的物件導向程式碼。