聲 明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
緣起
個人總結梳理,順便練練文筆,歡迎點贊!
開篇有益
OMD是快速入門ArcEngine的基礎,除了要會基礎的編程語言,ArcEngine二次開發還需能看懂OMD。
爲什麼學習OMD
A:當然是裝逼了!
B:To young,Too simple!
我個人覺得有如下幾點原因:
- 工業標準,不看標準直接擼代碼的,我敬你們是條漢紙。
- OMD可以幫助你整體的學習ArcEngine的架構,OMD相當於是軟件的骨骼經脈。
- ArcEngine類庫那麼多,OMD簡單易懂的圖譜像字典一般幫你快速導航相關的類庫。
- OMD可以幫助你體驗設計大師是如果設計架構的,ArcEngine的OMD中有好多設計模式的理念。
- OMD簡單清晰的描述了類之間的關係以及類的構造,助你打通經脈。
學習OMD能知道什麼
A:對象唄,這還有啥不知道的?
B:你就是個弟弟!
學習OMD我們可以知道如下信息:
- 該類支持哪些接口;
- 完成任務需要哪些對象;
- 如何使用該類的對象;
- 是否可以直接實例化類;
- 接口有哪些方法和屬性;
- 是否有其它類也支持該接口;
- 對象間的關係
- …
概念
UML:全稱Unified Modeling Language, 統一建模語言,是用來對軟件密集系統進行可視化建模的一種語言。UML爲面向對象開發系統的產品進行說明、可視化、和編制文檔的一種標準語言(ps:推薦看下《Thinking in UML》)。
OMD:全稱Object model diagrams,對象模型圖表。
ArcObjects/ArcEngine 的OMD參考位置:D:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Diagrams
OMD詳解
類和對象
在UML 圖中有三種類型的類:抽象類(abstract class)
、可創建類(createable class)
與可實例化類(instantiable class)
。
【抽象類/AbstractClass】不能用以創建新對象,但可以用來指定子類
。
*如Layer類就是一個抽象類,不可以直接New Layer()創建新對象。,它知識一個抽象的模板類。
//Layer是抽象類,不能創建,所以執行此句代碼會報錯
ILayer pLyr=new Layer();
【可創建類/CoClass】指的是那些你能夠直接使用開發環境中的對象定義語法來創建對象
。
//如FeatureLayer類,你可以直接New FeatureLay
IFeatureLayer pFeaLyr = new FeatureLayer();
【可實例化類/Class】不能夠直接創建新對象,但是這種類的對象能夠作爲其它對象的屬性被創建或是從其它類的方法中創建
。(簡單說就是他自己不能創建對象,只能由別人創建它的對象)
//如Workspace類,只能通過IWorkspaceFactory對象創建IWorkspace對象,不能自己New來創建。
IWorkspaceFactory pWsFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory();
IWorkspace pWs = pWsFactory.OpenFromFile(@"D:\0\dlggc.gdb", 0);
類和類之間的關係
主要包括:依賴關係、關聯關係、組合關係和繼承關係四中類型
- 依賴關係(可實例化):
表示一個對象可以產生(實例化)另外一個對象。
在圖中的虛線箭頭
表示是實例化關係,如Workspace依賴於WorkspaceFactory,可以通過WorkspaceFactory對象創建Workspace對象,不同的WorkspaceFactory對象可以創建不同的Workspace對象,Workspace會隨着WorkspaceFactory的不同而不同。 - 關聯關係:
指從一個類的對象訪問到另外一個類的對象,它是一種鬆散的關係。
在圖中的線
表示是關聯關係。有1對1,1對多,多對1,多對多幾種關係。如Fields類和Field類,Workspace類和Dataset類。 - 組合關係(組成關係):
指其中的一個類對象是另外一個類對象的組成部分,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。
在圖中的菱形
表示是組成關係,如Map類和Layer類,Map有多個圖層組成。 - 繼承關係:同面向對象中的繼承。父類不能直接產生類對象,只能通過派生子類的方法來實現自己,是一種比較強的關係。在
圖中的空心三角箭頭
表示是繼承關係,比如Layer和FeatureLayer之間就是繼承關係。
OMD符號
- 抽象類(AbstractClass):二維的內部有陰影的矩形。如:Dataset類
- 可創建類/組件類(CoClass):帶陰影的3D矩形符號。如:FeatureLayer類
- 可實例化類/普通類(Class):3D矩形內部沒有陰影。如:Workspace類
- 屬性(Property):啞鈴狀的圖標,Read(左側的啞鈴)和write(右側的啞鈴)。(建議延伸閱讀關於
傳值
和傳引用
的區別)- 右側控件的啞鈴代表寫入的時候傳入的是引用(put by value),相當於是C#中的傳值。
- 如果是實心的啞鈴代表寫入的時候傳入的是值或對象的副本(put by reference),簡單來說相當於C#中的傳引用,比如
ref
。
- 方法(Method):指向左側的箭頭。
- 接口(Interface):棒棒糖類型的圖標,接口分爲內接口和外接口,內接口爲空心棒棒糖,外接口爲實心棒棒糖。
- 內接口主要用來組織COM對象相關的方法和屬性,COM對象必須實現所有的接口內容;
- 外接口用來組織與COM對象相關的事件。
- 圖表之間的連接:蟲洞。
接口跳轉(QI)
在COM中,接口中僅定義了方法,而繼承該接口的類中實現了該方法。由於一個接口只能使用自己內部定義的方法,不能越界,就好比一個班級一樣,這個班級內有班長,有學習委員,有體育委員,每一位幹部負責自己職權範圍之內的事情,各位幹部相互協作,解決班級內的事情。這班級內的每一位幹部就相當於一個接口,而這個班級就相當於實現了這些接口的類。當這個班級的一些事情需要班長處理的時候,我們就執行班長這個接口中定義的方法,當需要學習委員處理的話,我們再將執行權交給學習委員這個接口,這也就是接口之間的互相訪問(Query Interface)。通過這個我們大體上對QI有了感性上的認識,下面我們通過實例演示一下。
我定義了兩個接口:
interface IFavoriteFood
{
void Food();
}
interface IVoice
{
void Voice();
}
然後定義了一個CatClass的類繼承這兩個接口,並實現這兩個接口中的方法:
class CatClass : IFavoriteFood, IVoice
{
public void Food()
{
Console.WriteLine("我喜歡吃老鼠。");
}
public void Voice()
{
Console.WriteLine("喵,喵,喵...");
}
}
下面在主函數中調用,代碼如下:
IVoice pVoice = new CatClass();
pVoice.Voice();//只能調用IVoice中定義的方法
IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;//指向同一個類的接口可以相互轉化,也就是QI
pFavoriteFood.Food();//只能調用IFavoriteFood中定義的方法
Console.ReadLine();
輸出結果:
這塊其實很好理解,比如一個類實現了兩個接口,從一個接口對象跳轉到另外一個接口,調用另外一個接口的方法,這就是QI。
學習的過程中你可以寫個QI的例子,自己體驗一下:
//創建IWorkspace對象
//用創建好的IWorkspace對象跳轉到IDataset對象上,其實就是As轉換
//調用IDataset接口中的方法
ArcEngine類庫
ArcObjects組件庫有4500多個對象可供開發人員調用, ArcGIS 10.3版本包含的類和接口個數彙總如下:
ArcGIS Engine開發中,爲了更好的管理這些COM對象,ESRI將這些COM對象放在不同的組件庫中,而它們被物理的放在bin目錄下的dll中,而邏輯上被分散到不同的命名空間中,下面我們詳細對一些類庫進行介紹。
Version
Version庫是ArcGIS 10新出來的一個類庫,該類庫包含了將獨立應用程序綁定到特定的ArcGIS 系列產品的函數和方法。
System
System庫是ArcGIS架構中最底層的一個庫,它包含了一些被其他庫使用的一些組件。
SystemUI
SystemUI庫定義了一些在ArcGIS中被用戶界面組件使用的類型。ICommand和ITool這樣的接口就在這裏定義。
Geometry
Geometry庫包含了核心的幾何對象,比如點,線,面等。定義和實現了空間參考的對象,包括投影和地理座標系。
Display
Display庫包含了支持在輸出設備上顯示圖形的組件,屏幕顯示,符號,顏色等都在這個庫中定義。
Controls
Controls庫包含了應用程序開發中用到的控件,包括在控件中使用的命令和工具。
Carto
Carto庫包含了爲數據顯示服務的對象。PageLayout和Map對象在這個庫中,以及支持各種數據類型的圖層,渲染。
GeoDatabase
GeoDatabase庫包含了所有相關數據組織的定義類型。要素,表,網絡,TIN都在這個庫中定義。
DataSourcesFile
DataSourcesFile庫包含了爲支持的矢量數據格式提供的工作空間工廠和工作空間。
DataSourcesGDB
DataSourcesGDB庫包含了爲存儲在RDBMS中的矢量和柵格數據提供的工作空間工廠和工作空間。
3D Analyst
包含了數據的3D分析對象,也包括顯示3D數據,在這個庫中有一個控件SceneControl可用。
GlobeCore
包含了globe數據分析的對象,也包含了顯示globe數據,在這個庫中有一個控件GlobeControl可用。
練習
打開你本地的OMD文件(參考位置D:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Diagrams
),打開一個OMD文件,如Geodatabase或Geometry的對象模型圖學習學習。
- 找到抽象類,可創建類,可實例化類,熟悉他們的符號,以及各自的特點。
- 找到類與類之間的四種關係,熟悉他們的符號,以及每種關係的特點。
- 查看具體類,查看該類有哪些屬性、方法,實現了哪些接口。
- 嘗試找一段代碼,通過OMD來體會理解代碼,體會上面三步中的知識點。
- 理解QI,嘗試利用ArcEngine提供的接口完成一個QI的例子。