在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的控制。