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

Delphi 介面編程 (1):前言——從 COM 到語言特性的演進

     編輯:Delphi

為什麼要學 Delphi 介面?

Delphi 3 引入介面本為支援 COM(元件物件模型),如今已進化為語言核心特性:**多態契約、自動生命週期、跨模塊二進制兼容、依賴注入基石**。掌握介面,是從「寫能跑的代碼」進階到「寫可維護、可測試、可擴展架構」的分水嶺。

COM 歷史閃回:為什麼是「二進制標準」?

1. 二進制 0/1          → 所有語言通識
2. 字符/整數/結構體    → 所有語言通識
3. 函數調用 (stdcall)  → 所有語言通識 (Win API 模式)
4. **對象/類**         → **語言各異:VTable 布局、繼承模型、構造語義、GC 機制全不兼容**

COM 解決第 4 點:定義 **二進制級的介面標準 (VTable + stdcall + 參數傳遞約定)**,
將「聲明 (介面)」與「實現 (類)」完全分離。
不同語言實現同一介面 → 二進制兼容 → 跨語言對象互操作。

COM 核心機制四步曲

  1. 註冊表查詢:客戶端通過 CLSID/IID 在註冊表定位組件路徑。
  2. 類工廠創建:IClassFactory.CreateInstance 實例化對象,返回介面指針,引用計數 +1。
  3. 引用計數管理:每次獲取介面 AddRef,用完 Release;計數歸零 → 對象自銷毀(早期 GC)。
  4. 介面查詢:QueryInterface(IID, PPV) 運行時發現對象支持的其他能力介面。

Delphi 如何繼承並發揚 COM 精神?

Delphi 介面 vs 抽象類:核心差異

COM 概念Delphi 語言映射增強點
IUnknownIInterface同義,Delphi 更常用前者名
VTable + stdcall介面方法隱式 stdcall編譯器保證調用約定
引用計數TInterfacedObject._AddRef/_Release自動管理,配合介面變量作用域
QueryInterfaceas 轉換 / 內部隱式調用類型安全,失敗拋異常非 AV
類工廠類構造函數 + 介面變量賦值語法級簡化,無需額外工廠對象
註冊表註冊可選 (COM 組件需註冊)純介面編程**無需註冊表**,零部署

我對介面的學習路徑建議

  1. 語法入門:介面聲明、類實現、介面變量賦值、自動釋放(本系列 2-3 節)。
  2. 契約思維:介面屬性、方法、唯讀寫方法、計算屬性(第 4 節)。
  3. 多態實戰:同一介面多實現、策略模式、工廠模式(第 5 節)。
  4. 進階專題:委託介面、介面列表、泛型介面、跨 DLL 介面、依賴注入容器、介面單元測試 Mock。

常見誤區預防針

「介面就是抽象類」 → 錯。介面無字段、無構造、多實現、自動釋放,本質不同。
「介面慢,有開銷」 → 微乎其微。單次間接調用 ~幾 CPU 周期,換來架構解耦極其划算。
「只做 COM 才用介面」 → 絕大多數 Delphi 介面用於**純進程內解耦**,從未觸碰註冊表。
「介面不能有實現」 → Delphi 10.4+ 支援 default 方法實現 (類似 Java 8 default interface method)。

系列文章導航

  1. 前言 (本文):COM 起源、核心機制、Delphi 映射、學習路徑
  2. 第一個例子:多介面實現、QueryInterface、十大規則
  3. 釋放機制:引用計數、四種場景實測、雙持有洩漏、構造陷阱、循環引用
  4. 介面屬性:無字段、讀寫映射方法、計算屬性、與類屬性對比
  5. 同一介面不同實現:策略模式、工廠、GUID、as 轉換、六大避坑

給讀者的話

介面看似簡單,實則蘊含「契約優於實現」「組合優於繼承」「自動資源管理」三大現代軟體工程核心思想。Delphi 以極简語法 (interface/class(..., IIntf)/TInterfacedObject) 將這些思想變為觸手可及的日常工具。願這個系列能幫你拨開霧霾,輕鬆駕馭介面編程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度抽象類介面
繼承單繼承 (單根)類可實現多介面 (多契約)
字段可有字段、狀態**絕無字段**,純行為
構造有構造函數、可帶參數無構造,由實現類決定
生命週期手動 Free / 所有者介面變量自動引用計數
跨模塊需共享基類編譯單元僅共享介面定義 (單元),二進制兼容
設計意圖「是一種」關係重用代碼「能做什麼」契約解耦實現