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