前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實現(xiàn)的細節(jié)_第1頁
前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實現(xiàn)的細節(jié)_第2頁
前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實現(xiàn)的細節(jié)_第3頁
前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實現(xiàn)的細節(jié)_第4頁
前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實現(xiàn)的細節(jié)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

.,第四章COM特性,前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實現(xiàn)的細節(jié)?,F(xiàn)在就可以編寫真正的組件了。可以把大的系統(tǒng)分解成一些小的組件對象,每個組件對象按照COM規(guī)范來實現(xiàn),再編寫一個或多個客戶程序調(diào)用這些組件,組件之間或組件與客戶之間通過COM接口進行通信。簡單的程序這樣做就可以了。,.,4.1可重用性:包容和聚合,面向對象系統(tǒng)的三個最基本的特性分別是:封裝、多態(tài)、重用封裝性體現(xiàn)在對所有對象狀態(tài)信息的訪問只能通過接口來訪問。多態(tài)性主要體現(xiàn)在三個層次上:接口成員函數(shù)、單個接口、一組接口所謂重用是指:當一個程序單元能夠對其它的程序單元提供服務時,盡可能地重用原先單元程序地代碼,既可以在源代碼一級重用,也可以在可執(zhí)行代碼一級重用。C+語言地重用性位于源代碼一級;而COM是建立在二進制一級上地標準,因此重用性也必然建立在二進制一級。,.,4.1.1包容和聚合,包容和聚合是COM地兩種重用模型。包容:假如已經(jīng)實現(xiàn)了一個COM對象A,他是現(xiàn)了接口ISomeInterface,在此還要實現(xiàn)另一個COM對象B,這個COM對象既要實現(xiàn)接口ISomeInterface,也要實現(xiàn)接口IOtherInterface,而且,ISomeInterface接口所提供地服務與對象A的接口所提供的服務基本一致,這樣就可以重用對象A來實現(xiàn)對象B的接口功能。最簡單的辦法是:在實現(xiàn)對象B的接口ISomeInterface時調(diào)用對象A的相應成員函數(shù),對于對象A來說,它只是當作一個普通的COM對象,而對于對象B來說,雖然它本身是一個COM對象,但同時也是對象A的客戶,因為他調(diào)用對象A的功能服務。對于對象B的客戶來說,他根本就不知道對象A的存在。包容模型在實際使用過程中可以非常靈活,對象B的成員函數(shù)在調(diào)用對象A的接口成員之前或者調(diào)用返回之后也可以進行其它一些操作,因此,對象B的ISomeInterface接口提供的功能可以超出對象A的接口功能,返回結果也可以不一致。,.,包容和聚合,對象A和對象B可以只是一個服務器與客戶的關系。對象A的創(chuàng)建和釋放完全在對象B內(nèi)部進行。對象B構造時,同時創(chuàng)建對象A的接口指針,以便自阿對象B的成員函數(shù)中使用;當對象B被釋放時,它先釋放對象A,這樣可以完成對象B對對象A的篏套使用,形成包容。要對其優(yōu)化,便可在對象B需要時創(chuàng)建對象A,在不需要時釋放對象A。聚合:對象B要實現(xiàn)兩個接口ISomeInterface和IOtherInterface,而對象A實現(xiàn)了ISomeInterface接口,并且不要對此接口進行修改便可滿足對象B的要求。如果采用包容模型,那么對象B要實現(xiàn)兩個接口,并且在ISomeInterface接口的成員函數(shù)中調(diào)用對象A的相應函數(shù),采用聚合則不一樣。對象B本生不實現(xiàn)接口ISomeInterface,他只實現(xiàn)IOtherInterface接口,但它也能提供接口ISomeInterface的功能,當對象B的客戶請求接口ISomeInterface時,對象B把對象A的ISomeInterface接口暴露給客戶,因此,客戶調(diào)用ISomeInterface是直接與對象A進行交互的,而客戶知道的只是對象B。,.,包容和聚合,在交互模型中,被聚合的對象A雖然直接向對象B的客戶提供功能服務,但它的生存周期受對象B控制,而且其它的一些行為也受到對象B控制,包括內(nèi)部狀態(tài)初始化、獲取數(shù)據(jù)等。實現(xiàn)交互的關鍵在于對象B的QueryInterface成員函數(shù),當客戶向對象B請求ISomeInterface接口時,對象B的QueryInterface函數(shù)把對象A的ISomeInterface接口指針放到輸出參數(shù)中,客戶程序就獲得了對象A的ISomeInterface接口指針,可以直接調(diào)用接口成員函數(shù)了。這樣還是有問題的,問題在于:當客戶程序通過ISomeInterface:QueryInterface函數(shù)又請求其它的接口指針時,問題就出現(xiàn)了。因為對象A并不知道對象B實現(xiàn)可什么樣的接口,而根據(jù)COM規(guī)范,客戶程序從對象B的任何一個接口可以獲取其它的任何接口指針。而且,在正常情況下,客戶程序調(diào)用對象A的ISomeInterface:QueryInterface函數(shù)請求IUnknown接口指針獲取的是對象A的Innknown接口指針,而客戶程序調(diào)用對象B的IOtherInterface:QueryInterface函數(shù)請求IUknown接口指針獲取的是對象B的IUknown接口指針,而COM規(guī)范要求的IUknown接口指針必須唯一。因此,為了使聚合順利實現(xiàn),對象A也必須能夠適應在被聚合的情況下進行的特殊處理,尤其是接口的QueryInterface成員函數(shù),在被聚合的情況下,當客戶請求它所不支持的接口或請求Ikknown接口時,它必須把控制交給外部對象,有外部對象決定客戶程序的請求結果。,.,包容和聚合,選擇重用模型依據(jù)的原則如下:在一個組件對象在行為上更類似于另一個組件對象的客戶,并且它要調(diào)用第二個對象的某些對象接口的情況下,適合用包容模型。如果一個現(xiàn)成的組件對象所實現(xiàn)的接口與將要實現(xiàn)的對象的接口的行為完全一致,則采用聚合模型更為適合,當然前提條件是現(xiàn)有的組件對象必須支持聚合特性才行。包容和聚合是COM對象的兩種出模型,它們相互并不矛盾,因此可以在一個對象中同時使用兩種模型,有的接口通過包容實現(xiàn),有的接口通過聚合實現(xiàn)。,.,包容實現(xiàn),內(nèi)部對象A實現(xiàn)了接口ISomeInteface,外部對象B要實現(xiàn)接口ISomeInterface和IOtherInterface,其接口如下定義:classISomeInterface:publicIuknownpublic:virtualHRESULT_stdcallSomeFunction()=0;classIOtherInterface:publicIuknownpublic:virtualHRESULT_stdcallOtherFunction()=0;在客戶程序、組件對象A和組件對象B三者之中,B包容A,客戶程序只知道對象B的存在,實際上對象B是對象A的客戶,負責對象A的創(chuàng)建、調(diào)用和釋放等工作。,.,包容實現(xiàn),列出其C+定義如下:classCB:publicISomeInterface,publicIOtherInterfaceprotected:Ulongm_ref;public:CB();CB();/成員函數(shù)HRESULEInit();private:ISomeInterface*m_pSomeInteface;因為對象B包容對象A,所以在對象B的成員函數(shù)中要調(diào)用對象A的接口成員函數(shù),因此在對象B的定義中加了數(shù)據(jù)成員m_pSomeInteface,記錄對象A的接口指針。,.,包容實現(xiàn),類CB的實現(xiàn):CB:CB()m_pSomeInteface=NULL;m_ref=0;CB:CB()if(m_pSomeInteface=NULL)m_pSomeInteface-Release();HRESULTCB:Init()HRESULTresult=:CoCreateInstance(CLSID_ComponentA,Null,CLSCTX_INPROC_SERVER,IID_ISomeInterface,(void*),.,包容實現(xiàn),需要對其進行說明如下:(1)在Init成員函數(shù)中,對象B創(chuàng)建了包容對象A,只要創(chuàng)建成功,則數(shù)據(jù)成員m_pSomeInteface記錄了對象A的ISomeInteface接口指針;當對象B被析構時,通過調(diào)用對象A的Release成員釋放對象A。(2)在對象B實現(xiàn)接口ISomeInteface的成員SomeFunction函數(shù)時,只是調(diào)用了對象A的相應函數(shù),出的概念在此體現(xiàn)出來。可以在對象初始化構造時調(diào)用Init成員函數(shù),因此對對象B的類廠的CreateInstance成員函數(shù)的實現(xiàn)有所不同,其如下:HRESULTCBFactory:CreateInstance()pObj=newCB();if(pObj=NULL)hr=pObj-Init();if()hr=pObj-QueryInterface(iid,ppv);returnhr;,.,包容實現(xiàn),當要對接口進行擴展時,可以通過接口繼承來實現(xiàn)接口的擴展,在實現(xiàn)新的接口時可以一個包容來重用以前的組件。例如,定義新的接口ISomeInterfaceEX對接口ISomeInterface進行擴展,其定義如下:classISomeInterfaceEX:publicISomeInterfacepublic:virtualHRESULE_stdcallNewFunction()=0;ISomeInterfaceEX接口可以重用已經(jīng)實現(xiàn)的ISomeInterface接口。實際上新的對象只要實現(xiàn)新加的成員函數(shù)NewFunction即可,而SomeFunction成員函數(shù)可以直接調(diào)用m_pSomeInterface的成員實現(xiàn)。如果新的對象的類名仍為CB,則代碼如下:virtualHRESULE_stdcallCB:SomeFunction()returnm_pSomeInterface-SomeFunction();,.,包容實現(xiàn),在包容模型中,外部對象重用內(nèi)部對象的接口時,可以是簡單的調(diào)用關系,也可以在調(diào)用內(nèi)部

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論