关于ArcEngine开发的一些感想和体会

时间:2021-04-30 16:27:39
  用AO开发已经有一段时间了,对AO开发的模式也有一定的了解了!AO是 ESRI开发的一组COM的集合,利用它用户可以进行二次开发,以快速建立满足自己要求的GIS应用.

    AO开发就是利用一些类和这些类的接口进行开发. 

    1、抽象类,类,和组件对象类 

    抽象类是不能实例化的,抽象类中是一系列抽象的方法,故是不能实例化的,它只能被继承。不同的类可以继承同一个抽象类,但内部对同一方法的实现可能是不一样的。如AO中的接口都是抽 GIS象类。用户可以在类中实现这些接口,也就是继承这些接口。如用户可以在自己的类中实现ICommand接口,生成一个Command,或者实现ICommand、ITool接口,生成一个Tool. 

    类是不能直接实例化的,它只能作为另一个类的属性或者被其它类的对象实例化。如Sde3Workspace Class、Sde4Workspace Class,FeatureClass,FeatureDataset它们是不能通过New直接实例化的,只能通过SdeWorkspaceFactory CoClass这个组件对象类所实现的IWorkspaceFactory接口里的Open方法来实例化。FeatureClass,FeatureDataset也是不能直接实例化的,他只能通过IFeatureWorkspace接口里的CreateFeatureClass,CreateFeatureDataset方法来实例化。

    组件对象类能够通过New来直接实例化。如 SdeWorkspaceFactory,QueryFilter它们是可以通过New来直接实例化的。 

    2、继承 

    3、类和接口的实现 

    一些类可能实现多个接口,一个接口也可能被多个类所实现,但不同的类实现同一个接口可能内部并不是一样的,这就实现了多态性.如ILayer这个接口被多个接口实现,其中包括FeatureLayer和RasterLayer,但这两个类实现ILayer接口时内部实现肯定是不一样的!但在外部对ILayer的操作是一样的! 

    4、接口之间的相互查询 

    一个类可以实现多个接口,每一个接口可能包括一系列的属性和方法,但有时候一个接口里可能没有你想要的方法和属性,可能在这个类所实现接口的另一个接口里,这就涉及到 GPS芯片从一个接口转到这个类所实现接口的另一个接口里,对于类所实现的一系列接口里,接口间是可以相互跳转的。如我想对一个feature的属性进行修改,给的就是这个feature的IFeature接口,我们知道对一个feature进行修改必须要把这个feature所在的featureclass的工作空间设为可编辑,且编辑结束后要结束编辑,这就要通过这个IFeatue接口来获得这个这个feature所在的IFeatureClass接口和IWorkspace接口,我们知道IFeatue接口里有一个object属性,这个属性返回的是IObjectClass,而FeatureClass这个类实现了IObjectClass和IFeatureClass这两个接口,这样就可以通过接口跳转从IObjectClass转换成IFeatureClass,这样就可以获得feature的IFeatureClass接口,其代码(c#)如下: 
         
    IObjectClass i_objcls=I_FtrCur.Class;
    IFeatureClass i_ftrcls=(IFeatureClass)i_objcls; 

    Feature所在的FeatureClass的IFeatureClass接口有了,还要这个FeatureClass所在的工作空间的IWorkspace接口,获取这个接口可以通过两个方法 

    一、通过IFeatureClass接口里的FeatureDataset属性来获得IFeatureDataset接口。

    IFeatureDataset接口里有一个Workspace属性返回IWorkspace接口,但这种方法有一个特别说明就是这个FeatureClass必须是一个FeatureDataset的成员,如果这个FeatureClass是一个独立,这个FeatureDataset返回的就是一个空值。所以这种方法对FeatureClass是一个FeatureDataset的成员时是适用的,独立时就不适用了。 

    二、通过接口转换。 

    FeatureClass实现了多个接口,其中有IDataset接口和IFeatureClass接口,我们已经有了IFeatureClass接口,就可以通过接口跳转来获得IDataset接口,在IDataset接口里有一个Workspace属性返回IWorkspace接口,这种方法对于FeatureClass是一个FeatureDataset的成员和FeatureClass是独立的这两种情况都是可以的。代码如下: 

    IDataset i_ftrDset=(IDataset)i_ftrcls   //接口跳转 
    IFeatureWorkspace i_wks=(IFeatureWorkspace)i_ftrDset.Workspace