




已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.,第四章COM特性,前一些章節(jié)已經(jīng)講述了COM的基本規(guī)范以及COM實(shí)現(xiàn)的細(xì)節(jié)。現(xiàn)在就可以編寫真正的組件了??梢园汛蟮南到y(tǒng)分解成一些小的組件對(duì)象,每個(gè)組件對(duì)象按照COM規(guī)范來(lái)實(shí)現(xiàn),再編寫一個(gè)或多個(gè)客戶程序調(diào)用這些組件,組件之間或組件與客戶之間通過(guò)COM接口進(jìn)行通信。簡(jiǎn)單的程序這樣做就可以了。,.,4.1可重用性:包容和聚合,面向?qū)ο笙到y(tǒng)的三個(gè)最基本的特性分別是:封裝、多態(tài)、重用封裝性體現(xiàn)在對(duì)所有對(duì)象狀態(tài)信息的訪問(wèn)只能通過(guò)接口來(lái)訪問(wèn)。多態(tài)性主要體現(xiàn)在三個(gè)層次上:接口成員函數(shù)、單個(gè)接口、一組接口所謂重用是指:當(dāng)一個(gè)程序單元能夠?qū)ζ渌某绦騿卧峁┓?wù)時(shí),盡可能地重用原先單元程序地代碼,既可以在源代碼一級(jí)重用,也可以在可執(zhí)行代碼一級(jí)重用。C+語(yǔ)言地重用性位于源代碼一級(jí);而COM是建立在二進(jìn)制一級(jí)上地標(biāo)準(zhǔn),因此重用性也必然建立在二進(jìn)制一級(jí)。,.,4.1.1包容和聚合,包容和聚合是COM地兩種重用模型。包容:假如已經(jīng)實(shí)現(xiàn)了一個(gè)COM對(duì)象A,他是現(xiàn)了接口ISomeInterface,在此還要實(shí)現(xiàn)另一個(gè)COM對(duì)象B,這個(gè)COM對(duì)象既要實(shí)現(xiàn)接口ISomeInterface,也要實(shí)現(xiàn)接口IOtherInterface,而且,ISomeInterface接口所提供地服務(wù)與對(duì)象A的接口所提供的服務(wù)基本一致,這樣就可以重用對(duì)象A來(lái)實(shí)現(xiàn)對(duì)象B的接口功能。最簡(jiǎn)單的辦法是:在實(shí)現(xiàn)對(duì)象B的接口ISomeInterface時(shí)調(diào)用對(duì)象A的相應(yīng)成員函數(shù),對(duì)于對(duì)象A來(lái)說(shuō),它只是當(dāng)作一個(gè)普通的COM對(duì)象,而對(duì)于對(duì)象B來(lái)說(shuō),雖然它本身是一個(gè)COM對(duì)象,但同時(shí)也是對(duì)象A的客戶,因?yàn)樗{(diào)用對(duì)象A的功能服務(wù)。對(duì)于對(duì)象B的客戶來(lái)說(shuō),他根本就不知道對(duì)象A的存在。包容模型在實(shí)際使用過(guò)程中可以非常靈活,對(duì)象B的成員函數(shù)在調(diào)用對(duì)象A的接口成員之前或者調(diào)用返回之后也可以進(jìn)行其它一些操作,因此,對(duì)象B的ISomeInterface接口提供的功能可以超出對(duì)象A的接口功能,返回結(jié)果也可以不一致。,.,包容和聚合,對(duì)象A和對(duì)象B可以只是一個(gè)服務(wù)器與客戶的關(guān)系。對(duì)象A的創(chuàng)建和釋放完全在對(duì)象B內(nèi)部進(jìn)行。對(duì)象B構(gòu)造時(shí),同時(shí)創(chuàng)建對(duì)象A的接口指針,以便自阿對(duì)象B的成員函數(shù)中使用;當(dāng)對(duì)象B被釋放時(shí),它先釋放對(duì)象A,這樣可以完成對(duì)象B對(duì)對(duì)象A的篏套使用,形成包容。要對(duì)其優(yōu)化,便可在對(duì)象B需要時(shí)創(chuàng)建對(duì)象A,在不需要時(shí)釋放對(duì)象A。聚合:對(duì)象B要實(shí)現(xiàn)兩個(gè)接口ISomeInterface和IOtherInterface,而對(duì)象A實(shí)現(xiàn)了ISomeInterface接口,并且不要對(duì)此接口進(jìn)行修改便可滿足對(duì)象B的要求。如果采用包容模型,那么對(duì)象B要實(shí)現(xiàn)兩個(gè)接口,并且在ISomeInterface接口的成員函數(shù)中調(diào)用對(duì)象A的相應(yīng)函數(shù),采用聚合則不一樣。對(duì)象B本生不實(shí)現(xiàn)接口ISomeInterface,他只實(shí)現(xiàn)IOtherInterface接口,但它也能提供接口ISomeInterface的功能,當(dāng)對(duì)象B的客戶請(qǐng)求接口ISomeInterface時(shí),對(duì)象B把對(duì)象A的ISomeInterface接口暴露給客戶,因此,客戶調(diào)用ISomeInterface是直接與對(duì)象A進(jìn)行交互的,而客戶知道的只是對(duì)象B。,.,包容和聚合,在交互模型中,被聚合的對(duì)象A雖然直接向?qū)ο驜的客戶提供功能服務(wù),但它的生存周期受對(duì)象B控制,而且其它的一些行為也受到對(duì)象B控制,包括內(nèi)部狀態(tài)初始化、獲取數(shù)據(jù)等。實(shí)現(xiàn)交互的關(guān)鍵在于對(duì)象B的QueryInterface成員函數(shù),當(dāng)客戶向?qū)ο驜請(qǐng)求ISomeInterface接口時(shí),對(duì)象B的QueryInterface函數(shù)把對(duì)象A的ISomeInterface接口指針?lè)诺捷敵鰠?shù)中,客戶程序就獲得了對(duì)象A的ISomeInterface接口指針,可以直接調(diào)用接口成員函數(shù)了。這樣還是有問(wèn)題的,問(wèn)題在于:當(dāng)客戶程序通過(guò)ISomeInterface:QueryInterface函數(shù)又請(qǐng)求其它的接口指針時(shí),問(wèn)題就出現(xiàn)了。因?yàn)閷?duì)象A并不知道對(duì)象B實(shí)現(xiàn)可什么樣的接口,而根據(jù)COM規(guī)范,客戶程序從對(duì)象B的任何一個(gè)接口可以獲取其它的任何接口指針。而且,在正常情況下,客戶程序調(diào)用對(duì)象A的ISomeInterface:QueryInterface函數(shù)請(qǐng)求IUnknown接口指針獲取的是對(duì)象A的Innknown接口指針,而客戶程序調(diào)用對(duì)象B的IOtherInterface:QueryInterface函數(shù)請(qǐng)求IUknown接口指針獲取的是對(duì)象B的IUknown接口指針,而COM規(guī)范要求的IUknown接口指針必須唯一。因此,為了使聚合順利實(shí)現(xiàn),對(duì)象A也必須能夠適應(yīng)在被聚合的情況下進(jìn)行的特殊處理,尤其是接口的QueryInterface成員函數(shù),在被聚合的情況下,當(dāng)客戶請(qǐng)求它所不支持的接口或請(qǐng)求Ikknown接口時(shí),它必須把控制交給外部對(duì)象,有外部對(duì)象決定客戶程序的請(qǐng)求結(jié)果。,.,包容和聚合,選擇重用模型依據(jù)的原則如下:在一個(gè)組件對(duì)象在行為上更類似于另一個(gè)組件對(duì)象的客戶,并且它要調(diào)用第二個(gè)對(duì)象的某些對(duì)象接口的情況下,適合用包容模型。如果一個(gè)現(xiàn)成的組件對(duì)象所實(shí)現(xiàn)的接口與將要實(shí)現(xiàn)的對(duì)象的接口的行為完全一致,則采用聚合模型更為適合,當(dāng)然前提條件是現(xiàn)有的組件對(duì)象必須支持聚合特性才行。包容和聚合是COM對(duì)象的兩種出模型,它們相互并不矛盾,因此可以在一個(gè)對(duì)象中同時(shí)使用兩種模型,有的接口通過(guò)包容實(shí)現(xiàn),有的接口通過(guò)聚合實(shí)現(xiàn)。,.,包容實(shí)現(xiàn),內(nèi)部對(duì)象A實(shí)現(xiàn)了接口ISomeInteface,外部對(duì)象B要實(shí)現(xiàn)接口ISomeInterface和IOtherInterface,其接口如下定義:classISomeInterface:publicIuknownpublic:virtualHRESULT_stdcallSomeFunction()=0;classIOtherInterface:publicIuknownpublic:virtualHRESULT_stdcallOtherFunction()=0;在客戶程序、組件對(duì)象A和組件對(duì)象B三者之中,B包容A,客戶程序只知道對(duì)象B的存在,實(shí)際上對(duì)象B是對(duì)象A的客戶,負(fù)責(zé)對(duì)象A的創(chuàng)建、調(diào)用和釋放等工作。,.,包容實(shí)現(xiàn),列出其C+定義如下:classCB:publicISomeInterface,publicIOtherInterfaceprotected:Ulongm_ref;public:CB();CB();/成員函數(shù)HRESULEInit();private:ISomeInterface*m_pSomeInteface;因?yàn)閷?duì)象B包容對(duì)象A,所以在對(duì)象B的成員函數(shù)中要調(diào)用對(duì)象A的接口成員函數(shù),因此在對(duì)象B的定義中加了數(shù)據(jù)成員m_pSomeInteface,記錄對(duì)象A的接口指針。,.,包容實(shí)現(xiàn),類CB的實(shí)現(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*),.,包容實(shí)現(xiàn),需要對(duì)其進(jìn)行說(shuō)明如下:(1)在Init成員函數(shù)中,對(duì)象B創(chuàng)建了包容對(duì)象A,只要?jiǎng)?chuàng)建成功,則數(shù)據(jù)成員m_pSomeInteface記錄了對(duì)象A的ISomeInteface接口指針;當(dāng)對(duì)象B被析構(gòu)時(shí),通過(guò)調(diào)用對(duì)象A的Release成員釋放對(duì)象A。(2)在對(duì)象B實(shí)現(xiàn)接口ISomeInteface的成員SomeFunction函數(shù)時(shí),只是調(diào)用了對(duì)象A的相應(yīng)函數(shù),出的概念在此體現(xiàn)出來(lái)。可以在對(duì)象初始化構(gòu)造時(shí)調(diào)用Init成員函數(shù),因此對(duì)對(duì)象B的類廠的CreateInstance成員函數(shù)的實(shí)現(xiàn)有所不同,其如下:HRESULTCBFactory:CreateInstance()pObj=newCB();if(pObj=NULL)hr=pObj-Init();if()hr=pObj-QueryInterface(iid,ppv);returnhr;,.,包容實(shí)現(xiàn),當(dāng)要對(duì)接口進(jìn)行擴(kuò)展時(shí),可以通過(guò)接口繼承來(lái)實(shí)現(xiàn)接口的擴(kuò)展,在實(shí)現(xiàn)新的接口時(shí)可以一個(gè)包容來(lái)重用以前的組件。例如,定義新的接口ISomeInterfaceEX對(duì)接口ISomeInterface進(jìn)行擴(kuò)展,其定義如下:classISomeInterfaceEX:publicISomeInterfacepublic:virtualHRESULE_stdcallNewFunction()=0;ISomeInterfaceEX接口可以重用已經(jīng)實(shí)現(xiàn)的ISomeInterface接口。實(shí)際上新的對(duì)象只要實(shí)現(xiàn)新加的成員函數(shù)NewFunction即可,而SomeFunction成員函數(shù)可以直接調(diào)用m_pSomeInterface的成員實(shí)現(xiàn)。如果新的對(duì)象的類名仍為CB,則代碼如下:virtualHRESULE_stdcallCB:SomeFunction()returnm_pSomeInterface-SomeFunction();,.,包容實(shí)現(xiàn),在包容模型中,外部對(duì)象重用內(nèi)部對(duì)象的接口時(shí),可以是簡(jiǎn)單的調(diào)用關(guān)系,也可以在調(diào)用內(nèi)部
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 分析市政工程考試中的創(chuàng)新與實(shí)踐結(jié)合試題及答案
- 2025年市政工程市場(chǎng)前景試題及答案
- 行政管理經(jīng)濟(jì)法重要考點(diǎn)試題及答案
- 2025年公共關(guān)系學(xué)盲點(diǎn)分析試題及答案
- 網(wǎng)紅效應(yīng)對(duì)公共關(guān)系的影響試題及答案
- 2025年財(cái)產(chǎn)抵押借款合同模板
- 互動(dòng)學(xué)習(xí)中的市政工程試題及答案
- 透析科患者出行協(xié)議書(shū)(2篇)
- 市政工程考試個(gè)人總結(jié)試題及答案
- 內(nèi)江市市中區(qū)事業(yè)單位招聘考試真題2024
- 燒燙傷健康宣教
- 醫(yī)院門診院感制度
- 腔隙性腦梗塞護(hù)理常規(guī)
- 《國(guó)務(wù)院安委會(huì)關(guān)于加強(qiáng)人員密集場(chǎng)所動(dòng)火作業(yè)安全管理措施》知識(shí)培訓(xùn)
- 人工智能在價(jià)格預(yù)測(cè)中的應(yīng)用-深度研究
- 統(tǒng)編歷史七年級(jí)下冊(cè)(2024版) 第一單元第4課-安史之亂與唐朝衰亡【課件】d
- 《新聞傳播學(xué)》課件
- Unit 3 The world of Science 大單元教學(xué)設(shè)計(jì)-2023-2024學(xué)年高中英語(yǔ)外研版(2019)必修第三冊(cè)
- 延邊大學(xué)《物聯(lián)網(wǎng)技術(shù)1》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年吉林省延邊州事業(yè)單位【綜合崗】考前沖刺歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
評(píng)論
0/150
提交評(píng)論