介面指標和介面
介面實作的實例實際上是方法指標陣列的指標,也就是參考介面中指定之所有方法實作的函式數據表。 具有多個介面的物件可以提供多個函式數據表的指標。 任何具有指標的程序代碼,其可透過該指標存取陣列,都可以呼叫該介面中的方法。
確切地說,這個多重間接存取並不方便,因此,介面函式數據表的指標必須呼叫其方法的另一個物件只是稱為 介面指標。 您可以使用 Visual C++ 或支援 COM 的其他面向物件語言,在 C 應用程式中手動建立函式數據表,或幾乎自動建立函式數據表。
透過適當的編譯程式支援(C和 C++ 固有的),用戶端可以透過其名稱呼叫介面方法,而不是在數位中的位置。 因為介面是類型,因此編譯程式會指定方法的名稱,可以檢查每個介面方法呼叫的參數類型和傳回值。 相反地,如果用戶端使用位置型呼叫配置,則即使 C 或 C++ 中也無法使用這類類型檢查。
每個介面都是方法功能群組的不可變合約。 您可以在執行時間參考具有全域唯一介面識別碼 (IID) 的介面。 這個 IID 是 COM 所支援之全域唯一標識碼 (GUID) 的特定實例,可讓客戶端精確地詢問物件是否支援介面的語意,而不需要額外負荷,而且系統可能會產生具有相同名稱之多個版本之相同介面的混淆。
總而言之,請務必瞭解 COM 介面是什麼,而不是:
- COM 介面與 C++ 類別不同。 純虛擬定義沒有實作。 如果您是 C++ 程式設計人員,您可以將介面的實作定義為類別,但這落在 COM 未指定之實作詳細數據的標題之下。 必須建立實作介面的對象實例,才能實際存在介面。 此外,只要行為符合介面定義,不同的物件類別可能會以不同的方式以二進位形式交換使用。
- COM 介面不是物件。 它只是一組相關的函式,而且是客戶端和對象通訊的二進位標準。 只要它可以提供介面方法的指標,就可以使用任何內部狀態表示的任何語言來實作物件。
- COM 介面是強型別。 每個介面都有自己的介面標識碼 (GUID),這可消除任何其他命名配置可能發生重複的可能性。
- COM 介面是不可變的。 您無法定義新版的舊介面,併為其提供相同的標識碼。 新增或移除介面的方法或變更語意會建立新的介面,而不是舊介面的新版本。 因此,新的介面無法與舊介面衝突。 不過,物件可以同時支援多個介面,而且可以公開具有不同標識符之介面的後續修訂介面。 因此,每個介面都是個別的合約,而且全系統物件不需要擔心他們呼叫的介面版本是否為預期版本。 介面識別碼 (IID) 會明確且唯一地定義介面合約。
相關主題