ArcObjects中的類結構關係圖
在ArcObjects中類分為三種,分別是抽象類(Abstract Class),元件類(CoClass)和普通類(Class)[普通類也叫做例項化類]。
如下圖所示:
為了更能形象的說明問題,將上圖具體化一個示例,如下圖所示:
抽象類只能被繼承。
元件類可以用New關鍵字建立。
普通類不能用New關鍵字建立,可以認為它的建構函式是private的,只能通過其他類(普通類或元件類)的方法產生,這個過程稱為例項化。
如下面的例子,A和B為普通類物件,C為元件類物件,D為一個普通類,如下面的程式碼:
A = B.writeA() 正確
A = C.writeA() 正確
A = New D() 不正確,普通類不能通過new的方法產生
A可以由B和C的writeA方法產生,A的生命週期是由產生它的物件的B和C控制的,如果B或C物件在記憶體中被釋放了,則此物件也將從記憶體中消失。
下面舉一個ArcObjects中普通類的例子:
以上圖片說明WorkspaceClass是個普通類,不能夠直接建立,但是可以通過IWorkspaceFactory介面的open方法來例項化產生,如下圖所示:
如果某個類是抽象類(比如WorkspaceFactory類)或者是普通類(比如Workspace類),那麼我們在檢視該類的幫助文件時,會發現在一開始就有如下一句話:
SomeClass is a non-creatable object. References to non-creatable objects must be obtained through other objects.
類之間的關係有四種:繼承、依賴、關聯、組合。
繼承比較簡單,就不說了。
依賴關係:比如A---------->B,就說一個物件有方法產生另一個物件,A的一個方法產生了B,即例項化產生了B的一個物件。當A的狀況發生變化時,B也會發生變化,如果A消失,那麼B也會消失。即前者的生命週期決定後者的生命週期。
關聯關係:比如Owener 1...* ------------ 1...* Land Parcel,這兩個物件是鬆散的關聯關係,可以從一個類的物件訪問到另一個類的物件。如一個土地可能有多塊土地,一塊土地也可能被多個所有者擁有。當其中的一個不存在時,另一個不會消失。再比如上圖中的chicken與nest的關係就是關聯關係。關聯關係是有方向的,如果只存在一個方向,稱為單項關聯;如果是兩個方向都存在關係,則稱為雙相關聯。如果沒有標註1...*,預設就是1。
組合關係:一定要區分組合關係與關聯關係的區別,因為二者都有可能出現1...*,二者的區別是組合關係會出現一個黑色的菱形,而關聯關係沒有。比如上圖中的ckicken與wings就是組合關係,而且是一對多的組合關係。wings是chicken的一部分,當chicken消失的時候,wings自然就不復存在。我們可以認為wings是chicken的一個集合,wings是該集合中的一個物件,當集合為nothing的時候,集合內的物件也將是nothing,即wings的生命週期肯定是由chicken物件控制的,但wings的產生不受chicken的控制。