網(wǎng)站背景css培訓(xùn)心得簡短
內(nèi)容整理自花利忠教授的課件
文章目錄
- 組件對(duì)象模型COM
- 基本概念
- 使用接口定義類
- 查詢接口(QueryInterface)
- COM總結(jié)
組件對(duì)象模型COM
基本概念
對(duì)象(Object):
系統(tǒng)中用來描述客觀事物的一個(gè)實(shí)體,構(gòu)成系統(tǒng)的一個(gè)基本單位。由類實(shí)例化產(chǎn)生
類(Class):
描述一組有相同特性(屬性)和相同行為(方法)的對(duì)象。
接口(Interface):
定義了一組方法和屬性的數(shù)據(jù)結(jié)構(gòu),通過這組數(shù)據(jù)結(jié)構(gòu),可以調(diào)用組件對(duì)象的功能
命名空間(Namespace):
用來組織類,通??梢园严嚓P(guān)聯(lián)的類放在一個(gè)命名空間中,進(jìn)行有效的管理
組件對(duì)象模型(Component Object Model):
COM不是接口,也不是對(duì)象,它是一種二進(jìn)制級(jí)別的組件通信標(biāo)準(zhǔn)。對(duì)象間的所有通信都是通過它們的接口來進(jìn)行的。
COM對(duì)象:
符合COM標(biāo)準(zhǔn)的對(duì)象,COM對(duì)象是實(shí)現(xiàn)了很多接口的對(duì)象
多態(tài)性:
同一操作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行接口。一個(gè)類可以有多個(gè)接口,一個(gè)接口可以由多個(gè)類實(shí)現(xiàn)
ArcGIS中類的多態(tài)性:幾個(gè)類使用同一個(gè)Interface,但每一個(gè)類卻執(zhí)行不同的方法和屬性
使用接口定義類
<接口名> <變量名> = new 類();
在COM中,對(duì)對(duì)象的訪問時(shí)通過接口完成的,因此不能像許多可視化控件那樣,可直接通過其名稱來調(diào)用屬性或執(zhí)行其方法。
//定義一個(gè)接口變量
IDrive pGarbage;
有了這個(gè)接口對(duì)象還不行,因?yàn)榻涌谑嵌x在對(duì)象上的,應(yīng)該產(chǎn)生一個(gè)對(duì)象,而對(duì)象又是從那里來的呢?–類。于是,實(shí)例化一個(gè)類
pGarbage = new GarbageTruck();
雖然我們實(shí)例化了一個(gè)GarbageTruck類,但是我們只得到了該類的IDrive接口,只能使用IDrive接口上的方法與屬性,如果要使用別的接口,需要使用這個(gè)接口變量pGarbage查詢出其他接口
查詢接口(QueryInterface)
COM對(duì)象有很多接口,不同的接口管理著不同類型的方法
因此可以從一個(gè)接口轉(zhuǎn)到另一個(gè)接口,稱為QI
這個(gè)過程是由Idispatch接口管理的
Idrive pCar = new RaceCar();
pCar.Accelerate(); //調(diào)用該接口的方法
IRace pRace = pCar as IRace; //接口查詢
//或者:IRace pRace = (IRace)pCar;
pRace.PitStop();
pCar.Accelerate();
COM總結(jié)
- COM不是接口,也不是對(duì)象
- 符合COM標(biāo)準(zhǔn)的對(duì)象稱為COM對(duì)象
- COM對(duì)象必須實(shí)現(xiàn)lunknown接口,它是默認(rèn)實(shí)現(xiàn)的接口,這個(gè)接口是管理COM對(duì)象聲明周期的,當(dāng)COM對(duì)象不使用的時(shí)候,這個(gè)接口定義的方法負(fù)責(zé)釋放內(nèi)存
- 每個(gè)組件都有一個(gè)獨(dú)一無二的標(biāo)識(shí),這就是所謂的全球唯一標(biāo)識(shí)符GUID 。這個(gè)標(biāo)識(shí)符就是COM組件的身份,它是一個(gè)128bits的數(shù)字,由系統(tǒng)自由分配
- 一個(gè)COM對(duì)象可以有多個(gè)接口,一個(gè)接口也完全可以被多個(gè)COM對(duì)象實(shí)現(xiàn),通過實(shí)現(xiàn)這些接口,COM實(shí)現(xiàn)了面向?qū)ο蟮亩鄳B(tài)性(幾個(gè)類可以有同樣的接口,
但是它們的實(shí)現(xiàn)可能是極不相同的) - COM對(duì)象的接口是抽象的,接口與類不同。因?yàn)榻涌跊]有任何的實(shí)現(xiàn),所以不能通過自身實(shí)例化。接口由具體的類來實(shí)現(xiàn),功能用接口抽象地模擬,并且用類取真正實(shí)現(xiàn)
- COM中的接口和類通常被當(dāng)做“做什么”和“怎么做”(What,How),接口定義一個(gè)對(duì)象能做什么(但自己什么都不做),類定義它怎么去做
- COM對(duì)象的接口是不可變的。接口永遠(yuǎn)都不會(huì)版本化。一旦定義下來并發(fā)布,接口不能夠改變
- DLL災(zāi)難:COM是可以被重用的,COM對(duì)象的實(shí)現(xiàn)過程也可以被修改升級(jí),如果兩個(gè)程序使用一個(gè)COM對(duì)象,而這個(gè)COM組件升級(jí)了的話,很可以就出現(xiàn)某個(gè)程序無法使用新組件的情況。
我們有時(shí)候安裝了新軟件后很多別的軟件都無法使用,很多都是因?yàn)镈LL HELL。別以為這是個(gè)小問題,這可是微軟提出.NET平臺(tái)的一個(gè)主要原因