ArcGIS Engine开发基础之QI

AO开发中QI(接口查询)非常重要,从某种意义上说不会QI就不会做AO开发。

在讲ArcGIS Engine开发QI实例操作之前,以一个现实生活例子以方便大家理解QI。

1.首先我先定义三个接口:IZou(走),IJingzou (竞走),IHeshui(喝水)如下所示
    interface IZou
    {
       void start();
       void stop();
    }
    interface IJingzou  :
IZou
    {
      void niupigu();
    }
    interface IHeshui
    {
      void heshui();
    }
2.定义一个人类实现IZou(走)IHeshui(喝水)两个接口
  class person : IZou,
IHeshui
  {
    void IZou.start()//注:显式接口实现后边会讲到
    {
       MessageBox.Show("开始走");
     }
    void IZou.stop()
    {
       MessageBox.Show("停止走");
    }
     void IHeshui.heshui()
    {
        MessageBox.Show("开始喝水");
    }
}
3.定义一个运动员类继承于人类实现IJingzou 接口
  class yundongyuan :
person, IJingzou
  {
     void IZou.start()
    {
       MessageBox.Show("开始走");
    }
    void IZou.stop()
    {
       MessageBox.Show("停止走");
    }
    void IJingzou .niupigu()
    {
       MessageBox.Show("开始扭屁股");
    }      
}

定义完接口与类,接下来我给大家演示QI
1.实例化一个person类。
 IZou pZou = new person();
 pZou.start();
 IJingzou  pJIngzou = pZou as
IJingzou ;//进行QI

pJIngzou.niupigu();//将会出错如下图所示

为什么会出现这个错误是因为用new实例化了一个人,但是并不是所有的人都会竞走的也就是说Person这个类没有实现IJingzou 这个接口所以报错。所以做QI之前必须查看你实例化的类是不是实现了相关接口。
2.实例化一个yundongyuan
 IZou pZou = new yundongyuan();
 pZou.start();
 IJingzou  pJIngzou = pZou as
IJingzou ;
 pJIngzou.niupigu();//将会执行如下图

通过实例化一个yundongyuan之后我就可以通过IZou接口直接QI到Ijingozu这个接口,然后执行Ijingozu接口所提供的方法这就是QI。
3.Ok我们现在我们再在第二部做个补充,运动员开始扭屁股竞走了,竞走运动员在竞走过程中太渴想喝水怎么办?痛过QI切换到IHeshui接口执行喝水方法即可,如下例
IZou pZou = new yundongyuan();
pZou.start();
IJingzou  pJIngzou = pZou as IJingzou ;
pJIngzou.niupigu();//将会执行
IHeshui pHeshui = pJIngzou as
IHeshui;//QI到IHeshui接口

pHeshui.heshui();//运动员将喝水

上边这个实例演示完,大家对QI会有所了解,那么如何在ArcGIS Engine开发中使用QI呢?接下来我以一个功能实例来演示一下QI在ArcGIS Engine开发中的使用。

下图在地图控件上有两个图层:一个面图层在上,一个是等高线图层在下

我们实现一个小功能,让面图层为半透明图层能够看到下边等高线图层,代码如下:

privatevoidbutton1_Click(objectsender,EventArgse)

{

      //获取第一个图层

ILayerpLayer =this.axMapControl1.get_Layer(0);

       

if(pLayerisIFeatureLayer)//如果第一个图层时矢量图层

{

ILayerEffectspLayerEffects = pLayerasILayerEffects;//进行QI,查询到ILayerEffects接口

pLayerEffects.Transparency =
65;//设置ILayerEffects接口的Transparency属性使该矢量图层的透明度属性为65.

}

}

通过以上操作第一个矢量图层有一定的透明度,可以看到面图层下边的等高线线图层,结果如下图所示:

分析:

   首先地图控件上的第一个图层是一个矢量图层是一个FeatureLayerClass对象,在ArcGIS Engine帮助文档可以看到在FeatureLayerClass这个类实现了ILayer和ILayerEffects这两个接口,那么就可以直接从ILayer接口查询到ILayerEffects接口。

大家可能会有这样的疑问:

为什么不直接使用类的全权名直接调用FeatureLayerClass的方法的调用、属性访问?因为FeatureLayerClass里实现相关接口的方法,属性的实现是,以显式接口的方式实现的。

例如在第一个实例中如果我们

person pperson = new person();
  pperson.start();//将会编译错误,不能通过类的全权名进行方法的调用,只能用接口实例来访问。

 接下来可能还有一个疑问:为什么要用显式实现接口的方法?

 这样做有以下两个目的:

1.隐藏类的复杂性

因为显式接口成员实现不能通过类或结构的实例来访问,所以它们可以用来隐藏某些成员。因为接口的成员都是公共的,可以被任意地访问,所以当想要对外隐藏接口时,就需要使用显式接口成员实现。

2.可以用来解决具有相同签名的成员之间的冲突

例如FeatureLayerClass这个类实现了ILayer和IFeatureLayer这两个接口,而这两个接口都有AreaOfInterest属性那么通过显式接口我就可以避免同名发生的混淆。

总结,当我们在开发时对某个对象(FeatureLayer,FeatureClass,Element等)进行操作实现功能开发时我们应该先看看你所操作的类实现了那些接口,从帮助中浏览相关接口的功能描述,然后再查询所要调用的方法。如果还需调用另外一个接口操作则进行QI。

arcgis engine 开发之QI的更多相关文章

  1. ArcGIS Engine开发之旅04---ARCGIS接口详细说明

    原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1.      IField接口(esriGeoDatabase)... 2 2.    ...

  2. ArcGIS Engine开发之旅10--空间参考及坐标转换

    原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...

  3. ArcGIS Engine开发之旅09--几何对象和空间参考

    原文:ArcGIS Engine开发之旅09--几何对象和空间参考 1.Geometry  Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处 ...

  4. ArcGIS Engine开发之旅08--和查询相关的对象和接口

    原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...

  5. ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据

    原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...

  6. ArcGIS Engine开发之旅05---空间数据库

    原文:ArcGIS Engine开发之旅05---空间数据库 1  Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...

  7. ArcGIS Engine开发之旅03--ArcGIS Engine中的控件

    原文:ArcGIS Engine开发之旅03--ArcGIS Engine中的控件 制图控件,如MapControl.PageLayoutControl,其中MapControl控件主要用于地理数据的 ...

  8. ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

    原文:ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...

  9. ArcGIS Engine开发之旅01---产品组成、逻辑体系结构

    原文:ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成:  面向开发人员的软件开发包(ArcGIS Engine Developer k ...

随机推荐

  1. IBM MQ Reason 2538(MQRC_HOST_NOT_AVAILABLE) 错误原因一例

    环境: .NET 4.0, MQ .NET客户端 IBM.XMS(v2.0.0.3) 测试代码如下: var factoryFactory = XMSFactoryFactory.GetInstanc ...

  2. 命令行插入含有中文的sql文件,报错ERROR 1366 (HY000): Incorrect stringvalue:

    --以下是插入语句: insert into sms_inbox values('123456','123456', 'cd', sysdate(), '今天天 气很好', 1, sysdate(), ...

  3. .NET4.5中WCF中默认生成的basicHttpsBinding的研究

    起因: 使用.net4.5建立了一个空白的WCF服务.默认使用的绑定配置是basicHttpsBinding. 问题发现: 1.用客户端进行服务引用,生成了默认的配置文件,其中绑定配置是basicHt ...

  4. Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)

    请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,老魏一直使用Linq来查询Entity Framework.但是老魏感觉,如果使用Linq的话,那么Linq的返回 ...

  5. iOS开发网络篇—大文件的多线程断点下载(转)

    http://www.cnblogs.com/wendingding/p/3947550.html   iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...

  6. JAVA类与对象(三)----类定义关键字详解

    static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就是全类 ...

  7. 微软职位内部推荐-Principal Dev Manager

    微软近期Open的职位: Title: Principal Dev Manager Location: Beijing The R&D of Shared Data Platform at S ...

  8. MS SQL Server中的CONVERT日期格式化大全

    CONVERT 将某种数据类型的表达式显式转换为另一种数据类型.由于某些需求经常用到取日期格式的不同. 现以下可在SQL Server中将日期格式化. SQL Server 支持使用科威特算法的阿拉伯 ...

  9. Java中List和ArrayList的区别

    List:是一个有序的集合,可以包含重复的元素.提供了按索引访问的方式.它继承 Collection.List有两个重要的实现类:ArrayList 和 LinkedListArrayList:我们可 ...

  10. sed 详解

    sed 详解 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕 ...