AE开发COM组件与接口小节内容COM组件对象模型简介如何使用COM类接口Interfaces多态Polymorphism接口查询QueryInterface测试一个对象的引用的常用方法Isitnothing?Whattypeofobjectisit?COM简介COM是创建类的一个标准COM类可以在不同的工程中重用不依赖于具体的开发语言所有的ArcObjects都是COM类ArcObjects基于COM技术构建对象连接与嵌入技术(OLE)OLEDB技术ActiveX技术是COM技术的一种封装DCOM和COM+COM类拥有接口对象拥有一个或多个接口接口是定义了一组方法和属性的逻辑关系与对象的通信是通过接口来进行的RaceCarAccelerateBrakeFuel停靠站圈速度IRaceIDrive垃圾车加速刹车燃料拾起倾倒IGarbageIDrive通信契约——接口接口的秘密接口可以被看做一种定义了必要的方法和属性的类型。作为类型而存在,是类型(Class)一般行为的定义和契约。VehicleClass加速刹车燃料IDrive启动接口的作用定义多个类型都需要的公共方法和属性。作为一种不可实例化的类型存在。在讨论COM接口时,COM规范(微软,1995)着重强调以下四点:接口不是类。接口不能实例化自身,因为其上没有实现。接口不是对象。接口是一个相关功能组,是客户和对象之间通信的二进制标准。接口具有很强的类型性。每个接口都有自己的接口标识符,因此消除了具有人们易读相同名字接口间可能的冲突。接口是不变的。接口从来没有版本。一旦接口被定义和公布就不能改变。COM接口使用一个接口指向一个COM类someinterfacevariable=newcoClass接口集合了属性和方法IDrivepGarbage=newGarbageTruck();pGarbage.Fuel=Full“;pGarbage.Accelerate();使用ArcObjectsCOM类GarbageTruckAccelerateBrakeFuelPickUpDumpIGarbageIDrive更多的接口例子…一个组合音响的例子一个对象可以播放收音机、磁带、CD必须使用适当的接口如果选择了播放磁带的接口,则不能收听收音机IRadioITapeICDITapepBBox=newBoomBox();pBBox.FM=true;//errorIDrive燃料加速刹车多态许多不同的类可以支持相同的接口拥有相同的所有的方法和属性可以有不同的执行方式和拥有不同的属性值多态ArcObjects多态许多ArcGIS的类都表现出多态的特性所有的子类都是集成了接口ILayer:Alllayertypes(raster,tin,feature,etc.)IGxFile:AllArcCatalogfiletypes(shapefile,map,table,etc.)IActiveView:Map(dataview)andPageLayout(layoutview)Severalothers…使用接口的属性和方法定义一个指向接口的遍历实例化一个对象调用方法和设置属性只能使用定义的接口的属性和方法//CreateanewRaceCarwithIDriveIDrivepCar=newRaceCar();pCar.Accelerate();pCar.Fuel=Full“;pCar.PitStop();//可以吗?RaceCarAccelerateBrakeFuelPitStopLapTimeIRaceIDrive//CreateanewRaceCarwiththeIDriveinterfaceIDrivepCar=newRaceCar();pCar.Accelerate();//SwitchinterfacesIRacepRace=pCarasIRace;pRace.PitStop();pCar.Accelerate();//pCar和pRace指向相同的对象**取得其他的接口接口查询(QI)访问其它接口的属性和方法RaceCarAccelerateBrakeFuelPitStopLapTimeIRaceIDrive使用类库命名空间许多类库中有相同的类名和接口名可以明白地引用对象库在EsriCore库中创建一个新的点和线对象ESRI.ArcGIS.esriCore.IpointpPoint=newPoint();ESRI.ArcGIS.esriCore.IlinepLine=newLine();使用ESRIObject浏览器列表类、接口、属性和方法位置:ArcGISinstallationfolder\ArcGIS\DeveloperKit\tools\EOBrowser.exeis判断•检查对象是否与给定类型兼容。•如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则is表达式的计算结果将是true。否则为false。if(layerisIFeatureLayer){}as转换•as运算符用于在兼容的引用类型之间执行转换。•如果无法进行转换,则as返回null而非引发异常。expressionastype等效于:expressionistype?(type)expression:(type)nullIFeatureLayerftrLayer=layerasIFeatureLayer;”non-creatable”类对象的创建•non-creatable类不能直接采用new创建对象实例。•必须通过类提供的创建函数或者其他类的创建方法来创建。•比如:FeatureClass类是non-creatable类,通常通过FeatureWorkspace来创建。FeatureClass对象创建IWorkspaceFactoryworkspaceFactory=newESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();IFeatureWorkspacefeatureWorkspace=(IFeatureWorkspace)workspaceFactory.OpenFromFile(dataPath,0);IFeatureClassfeatureClass=featureWorkspace.OpenFeatureClass(nameOfShapefile);推荐的学习方法•看ArcEngine帮助文档•分析ArcEngine的示例程序•多练习问题•如何获取图层中某一个要素的某一个字段的信息?•GIS查询有哪几种?•如何进行查询?