之前, 有朋友誇過我: 博文通俗易懂, 能把復雜的問題簡單化;
希望我對接口的理解也能對大家有所幫助; 不過其中個人理解的成分多些, 錯誤之處萬望指出.
"接口" 的概念和 "類" 特別是 "抽象類" 近似, Delphi 之初並沒有接口, 後來(Delphi 3)為了支持 COM 引入了接口, 再後來發展成為 Delphi 重要的語言特性.
應該先簡單了解點 COM, 說到 COM, 能讓我想到 "有心栽花花不活, 無意插柳柳成蔭" 的古話.
微軟在開發 OLE 時, 有一種需求: 使用其他程序中的對象, 這種需求導致了 COM 的誕生並發揚光大, 而 OLE 卻在慢慢地銷聲匿跡.
從 COM 到 COM+, 之後好像微軟並沒有再大力發展(可能是把精力都放到 Net 上去了, 但 Net 也沒離開 COM), 它現在仍有著非常廣泛的應用, 這應該得益於它先進的思想.
慢慢道來:
1、一個二進制的 1 或 0, 這是任何語言都可以識別的;
2、一個字符, 也是任何語言都可以識別的;
3、一個整形變量, 也是任何語言都可以識別的;
4、一個結構體, 也是任何語言都可以識別的;
5、一個函數也沒有問題, 譬如 Delphi 調用 API;
6、但一個 "對象" 或著 "類" 呢? 這在跨程序、跨語言時就不好識別了.
COM 解決了這個問題! 並進而應用於網絡.
COM 規定了一個二進制的標准, 這個標准主要針對 "對象方法的聲明"(也就是接口), 同時把聲明(接口)和實現分開.
不同的語言都可以來實現這個接口、同時不同的語言(在遵循標准的情況下)也都能識別這個接口, 從而實現的跨語言的對象的交互.
現在看看這個過程其實是水到渠成、挺自然的; 但好像當初微軟的 COM 之路也並不平坦.
微軟通過 COM 組件的方式提供了很多功能, 它們很可能是用 C++ 實現的, 我們用 Delphi 可以很好的使用, 本質上說就是 Delphi 遵循了那個二進制的標准; 相反, Delphi 按這個標准聲明、並用自己的語言實現的 COM 組件也能供其他語言使用.
一個 COM 組件裡有什麼呢?
主要是一堆接口(也就是聲明)和接口的實現, 每個接口對應一個計數器, 另包含一個叫 "類廠" 的東西.
使用 COM 步驟可能是這樣的:
1、程序在使用組件之初, 先聯系 "接口"; 這應該是從注冊表中查詢.
2、找到後, 如果此接口還沒有被實現, 馬上調用 "類廠" 建立起對象, 並同時給接口計數器加 1.
3、可能會不止一個程序在使用同一個接口, 但每有使用則 "計數器+1", 每次用完則 "計數器-1".
4、當接口的使用計數為 0 時, 系統自動釋放類廠為該接口建立的對象(垃圾回收機制).
我們 Delphi 中的接口當然也是這樣, 用完會自動釋放, 無需手動 free.
接口在 Delphi 中繼續支持著 COM 並繼續完善著, 接下來要討論的是作為語言特性的 "接口" 概念與使用.
我曾經被 "接口" 置於雲霧之中, 一些書也讓人越看越糊塗; 明白了以後發現其實挺簡單的, 相比 "類" 的規則要簡單許多.