補充幾個名詞概念:
UML:Unified Modeling Language 整合模組化語言,是用來對軟體密集系統進行可視化建模的一種語言。UML為物件導向開發系統的產品進行說明、可視化、和編製文檔的一種標準語言。
OMD:Object model diagrams 物件模型圖表表。
首先來看看OMD能幫我們做什麼?
1. 該類支援哪些介面;
2. 完成任務需要哪些對象;
3. 如何使用該類的對象;
4. 是否可以直接執行個體化類;
5. 介面有哪些方法和屬性;
6. 是否有其它類也支援該介面;
7. 對象間的關係
下面圖示中,便是貫穿本書的物件模型圖表的鑰匙。
這些符號是基於UML 畫圖工具建立的,UML 符號是物件導向分析和設計的工業圖樣標準。
物件模型圖表中提供的資訊非常多,是物件瀏覽器中資訊的重要補充。Visual Basic,或者其它的開發環境,都會列出所有的類和成員,但不會指明這些類之間的關係。所以,物件模型圖表是非常有利於讀者對ArcInfo 組件的理解的!
本書使用UML 來描述ArcInfo 組件,即ArcObjects,並描述你能夠建立的資料模型。
以下詳細說明。
1. 類和對象
在UML 圖中有三種類型的類:抽象類別(abstract class)、可建立類(createable class)與可執行個體化類(instantiable class)。
抽象類別不能用以建立新對象,但可以用來指定子類。舉個例子,“line”(線)是“primaryline”(幹線)和“secondary line”(副幹線)的抽象類別。
可建立類指的是那些你能夠直接使用開發環境中的對象定義文法來建立對象。比如在Visual Basic 中是這樣書寫:Dim As New <object> 或者CreateObject <object>。
可執行個體化類不能夠直接建立新對象,但是這種類的對象能夠作為其它對象的屬性被建立或是從其它類的方法中建立。------比較難理解。
2. 關聯
在抽象類別、可建立類和可執行個體化類之間,有幾種存在的關聯(或稱關係)。
聯絡(association)便描述了類之間的關聯。在兩端的類中可以定義多重性( Multiplicity)關聯。
類繼承(type inheritance)定義了專門的類,它們擁有超類的屬性和方法,並且同時也有自身的屬性和方法。
執行個體化(Instantiation)指定一個類的對象有這樣的方法,它能夠建立另外一個類的對象。
彙總(Aggregation)是一種不對稱的關聯方式,在這種方式下一個類的對象被認為是一個“整體”,而另一個類的對象被認為是“組件”。
組成(Composition)是一種更為強壯的彙總方式,此種方式下,“整體”對象控制著“部分”對象的存留時間。
在安裝完AE後,我們就可以在相關目錄中找到AE的OMD圖,
一般在 安裝目錄"DeveloperKit"Diagrams下
其中
OMD中的符號:
一個三角形符號 表示繼承
菱形的黑色小塊 表示組成
虛線前頭帶個箭頭 表示用來建立
* 表示對應關係1:N
一條直線表示 聯合
類的類別:
抽象類別:不能建立或執行個體化,從來沒有一個抽象類別的執行個體
用於定義子類的公用介面,子類繼承其定義的介面。
OMD符號為:二維的內部有陰影的矩形。
執行個體化類:不能建立,從別的對象獲得執行個體。
OMD符號為:3D矩形內部沒有陰影。
可建立的類:用New關鍵字建立對象或者從別的對象獲得運行執行個體。
OMD符號為:帶陰影的3D矩形符號。
屬性和方法:
屬性:啞鈴狀的表徵圖,Read(左側的啞鈴)和write(右側的啞鈴)
方法:指向左側的箭頭
介面:棒棒糖類型的表徵圖
圖表之間的串連:蟲洞
個人感覺在OMD圖中比較難理解的就是可執行個體化類CLASS。我做了以下例子去理解它:
ArcEngine中 workSpace 就是一個可執行個體化類,
WorkSpace不能用new建立,但可以通過WorkSpaceFarctory.Openfromfile()方法來建立.如下:
IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(ConnectionString, 0);
但當我們嘗試用New去建立一個Workspace類時,如下:
IWorkspace pWorkspace = new WorkspaceClass();
就會出現以下錯誤:
“類型”ESRI.ArcGIS.Geodatabase.WorkspaceClass未定義建構函式;
所以,Class和CoClass的主要區別就是CoClass是帶建構函式的Class.以此它可以用New直接建立對象