介面和介面實作

COM 在介面定義與其實作之間有基本區別。

介面實際上是一個合約,其中包含一組相關函式原型,其使用方式已定義,但實作不是。 這些函式原型相當於 C++ 程式設計中的純虛擬基類。 介面定義會指定介面的成員函式,稱為 方法、其傳回型別、其參數的數目和類型,以及其必須執行的動作。 沒有與介面相關聯的實作。

介面實作是程式設計人員提供的程式代碼,可執行介面定義中指定的動作。 程式設計人員可在以對象為基礎的應用程式中使用的許多介面實作都包含在 COM 連結庫中。 不過,程式設計人員可以自由地忽略這些實作並自行撰寫。 建立該對象的實例時,介面實作會與 對象相關聯,而實作會提供物件所提供的服務。

例如,名為 IStack 的假設介面可能會定義兩個名為 Push 和 Pop 的方法,指定 Pop 方法的後續呼叫會以反向順序傳回先前傳遞至 Push 方法的值。 此介面定義不會指定如何在程式碼中實作函式。 在實作 介面時,一位程式設計人員可能會實作堆疊做為陣列,並以存取該陣列的方式實作 Push 和 Pop 方法,而另一個程式設計人員可能會使用連結清單,並據以實作方法。 不論 Push 和 Pop 方法的特定實作為何,IStack 介面指標的記憶體內部表示法,因此用戶端會完全由介面定義決定。

簡單物件僅支援單一介面。 更複雜的物件,例如可內嵌的物件,通常支持數個介面。 用戶端只能透過其中一個介面的指標存取 COM 物件,這反過來又允許用戶端呼叫構成該介面的任何方法。 這些方法會決定用戶端如何使用對象的數據。

介面會定義物件與其客戶端之間的合約。 合約會指定必須與每個介面相關聯的方法,以及每個方法的行為在輸入和輸出方面必須是什麼。 合約通常不會定義如何在介面中實作方法。 合約的另一個重要層面是,如果對象支援介面,它必須以某種方式支援該介面的所有方法。 實作中的所有方法都不需要執行某些動作。 如果物件不支援方法所隱含的函式,其實作可能是簡單的傳回,或是傳回有意義的錯誤訊息,但方法必須存在。

COM 物件和介面