COM為所有的組件對象規定了一個必須實現的基接口IUnknown,這不僅定義了最基本的公共服務,而且還使一個指向IUnknown接口的指針客觀上成為組件實例的對象標示.除對象生存期的管理外,這種對象標示還使COM組件具有了自解釋的特性:通過對Iunknown接口的成員函數QueryInterface的調用可以查詢到對象實現的所有接口.
不過上述自動化的各種優點是以其數據類型的限制和性能的部分損失為代價的.雖然編譯器可以通過類型庫進行前綁定(參數類型的檢查,符號到分發ID的轉換),但是最耗時的InVoke卻難以優化.為此COM規定了雙接口機制,為程序員提供了在動態綁定與靜態聯編之間選擇的自由.同時,自動化技術的存在,也為腳本語言(VBScript, JavaScript)提供了活力.
三 包容和聚合
作為面向對象系統的重要特性,COM支持兩種重用模型:包容(containment)和聚合(aggregation)它們的思路基本一致,只是在實現方法上有所不同.
考慮包容的情況,假定已經有一個實現了接口IReuseInterface的COM對象A,由于新的需求,我們又要實現一個新的COM對象B,它既要實現接口IReuseInterface,又要實現接口INewInterface,而且IreuseInterface所提供的服務與對象A的接口基本一致,只要再實現新添加的功能就可完成對象B的開發.最直觀的想法就是在對象B的內部"包容"一個對象A的實例.所有對B的接口IreuseInterface成員函數的調用均在其內部簡單地轉發給對象A,對于B的客戶來說,根本無需知道A的存在.
包容模型在實現時較為靈活,可以再將調用轉發給內部對象的前后,進行一些本地化的處理,從而彌補A和B各自IreuseInterface接口在功能上的微小差異.
原文轉自:http://www.anti-gravitydesign.com