上課可以嗎?不壹定,新的問題會隨之而來。也許我們有壹個部門,有很多人可以做很多事情。我們怎樣才能在部門內部實現更好的管理?例如,我們有壹個提供許多方法和屬性的類。這些方法和屬性其實可以分成堆來服務不同的功能,但是我們的類不做這種管理。在AO中,地圖對象有許多功能,如管理圖層、管理元素、管理選擇集和顯示地圖。每個不同的函數都有許多方法和屬性。這些屬性和方法是無序的,堆在壹個類裏,沒有任何區別。我們程序員需要找方法的時候,要壹個壹個找,很不方便。
這時,介介出現了。當C++的發明者第壹次提出純虛函數(實際上是接口)的概念時,遇到了很大的阻力。許多人沒有理解接口的重要性。虛函數我們用的好好的,為什麽出來壹個空架子什麽都沒有?假設是類,但不能產生對象;假設它是壹個對象,沒有方法體可以使用。接口做了壹件好事,就是對類內部進行分類。對於map對象,我們可以做幾個接口,分別定義不同函數的方法、函數和屬性,map類實現這些接口,這樣就可以用接口定義來實現對象。所以,所謂接口就是壹系列相關方法和屬性集的定義。
Dim pGraphicsContainer作為iGraphicsContainer
pGraphicsContainer = application . document . active view . focus map
pGraphicsContainer可以使用的屬性和方法只能是其定義的部分,而不能是管理元素等接口定義的方法和屬性。那我們怎麽用其他功能呢?這就是所謂的QI(查詢接口)功能。從壹個接口到另壹個接口的查詢。
Dim pGeoFeatureLayer作為iGeofeatureLayer
pGeoFeatureLayer = pGraphicsContainer QI
好了,我們講了這麽多,已經進入了COM的概念。在正式介紹COM之前,我們還得說最後壹件事:計算機語言的發展史,其實就是壹部不斷提高組件粒度和代碼重用的歷史。我們以前用過程和函數,後來用類和接口,都是為了壹個目的,讓我們操作的組件在具體和抽象之間找到平衡。太具體,比如程序和功能,沒有框架;太抽象了,比如階級,分不清。
壹個代碼示例:public interface form { void show();voidShowDialog();} public class A:IForm { publicvidshow(){ } publicvidshowdialog(){ } } public classb:IForm { publicvidshow(){ } publicvidshowdialog(){ } } public classformfactory { publicstaticIFormCreateInstance(string parm){ if(parm = = A){ return newa();else if(parm = = B)return new B();} returnnull}}這是邏輯的抽象。
這是具體的方法。
這就是編程的哲學。