為什麼要學 Delphi 介面?
Delphi 3 引入介面本為支援 COM(元件物件模型),如今已進化為語言核心特性:**多態契約、自動生命週期、跨模塊二進制兼容、依賴注入基石**。掌握介面,是從「寫能跑的代碼」進階到「寫可維護、可測試、可擴展架構」的分水嶺。
COM 歷史閃回:為什麼是「二進制標準」?
1. 二進制 0/1 → 所有語言通識
2. 字符/整數/結構體 → 所有語言通識
3. 函數調用 (stdcall) → 所有語言通識 (Win API 模式)
4. **對象/類** → **語言各異:VTable 布局、繼承模型、構造語義、GC 機制全不兼容**
COM 解決第 4 點:定義 **二進制級的介面標準 (VTable + stdcall + 參數傳遞約定)**,
將「聲明 (介面)」與「實現 (類)」完全分離。
不同語言實現同一介面 → 二進制兼容 → 跨語言對象互操作。
COM 核心機制四步曲
- 註冊表查詢:客戶端通過 CLSID/IID 在註冊表定位組件路徑。
- 類工廠創建:
IClassFactory.CreateInstance 實例化對象,返回介面指針,引用計數 +1。
- 引用計數管理:每次獲取介面
AddRef,用完 Release;計數歸零 → 對象自銷毀(早期 GC)。
- 介面查詢:
QueryInterface(IID, PPV) 運行時發現對象支持的其他能力介面。
Delphi 如何繼承並發揚 COM 精神?
| COM 概念 | Delphi 語言映射 | 增強點 |
| IUnknown | IInterface | 同義,Delphi 更常用前者名 |
| VTable + stdcall | 介面方法隱式 stdcall | 編譯器保證調用約定 |
| 引用計數 | TInterfacedObject._AddRef/_Release | 自動管理,配合介面變量作用域 |
| QueryInterface | as 轉換 / 內部隱式調用 | 類型安全,失敗拋異常非 AV |
| 類工廠 | 類構造函數 + 介面變量賦值 | 語法級簡化,無需額外工廠對象 |
| 註冊表註冊 | 可選 (COM 組件需註冊) | 純介面編程**無需註冊表**,零部署 |
Delphi 介面 vs 抽象類:核心差異
| 維度 | 抽象類 | 介面 |
| 繼承 | 單繼承 (單根) | 類可實現多介面 (多契約) |
| 字段 | 可有字段、狀態 | **絕無字段**,純行為 |
| 構造 | 有構造函數、可帶參數 | 無構造,由實現類決定 |
| 生命週期 | 手動 Free / 所有者 | 介面變量自動引用計數 |
| 跨模塊 | 需共享基類編譯單元 | 僅共享介面定義 (單元),二進制兼容 |
| 設計意圖 | 「是一種」關係重用代碼 | 「能做什麼」契約解耦實現 |
我對介面的學習路徑建議
- 語法入門:介面聲明、類實現、介面變量賦值、自動釋放(本系列 2-3 節)。
- 契約思維:介面屬性、方法、唯讀寫方法、計算屬性(第 4 節)。
- 多態實戰:同一介面多實現、策略模式、工廠模式(第 5 節)。
- 進階專題:委託介面、介面列表、泛型介面、跨 DLL 介面、依賴注入容器、介面單元測試 Mock。
常見誤區預防針
「介面就是抽象類」 → 錯。介面無字段、無構造、多實現、自動釋放,本質不同。
「介面慢,有開銷」 → 微乎其微。單次間接調用 ~幾 CPU 周期,換來架構解耦極其划算。
「只做 COM 才用介面」 → 絕大多數 Delphi 介面用於**純進程內解耦**,從未觸碰註冊表。
「介面不能有實現」 → Delphi 10.4+ 支援 default 方法實現 (類似 Java 8 default interface method)。
系列文章導航
- 前言 (本文):COM 起源、核心機制、Delphi 映射、學習路徑
- 第一個例子:多介面實現、QueryInterface、十大規則
- 釋放機制:引用計數、四種場景實測、雙持有洩漏、構造陷阱、循環引用
- 介面屬性:無字段、讀寫映射方法、計算屬性、與類屬性對比
- 同一介面不同實現:策略模式、工廠、GUID、as 轉換、六大避坑
給讀者的話
介面看似簡單,實則蘊含「契約優於實現」「組合優於繼承」「自動資源管理」三大現代軟體工程核心思想。Delphi 以極简語法 (interface/class(..., IIntf)/TInterfacedObject) 將這些思想變為觸手可及的日常工具。願這個系列能幫你拨開霧霾,輕鬆駕馭介面編程。
- 上一篇文章: Delphi 介面編程 (2):第一個例子——多介面實現與查詢
- 下一篇文章: Delphi 實戰:用 TListView 顯示數據庫內容(vsReport 模式完整指南)
Copyright ©
程式碼之家 All Rights Reserved