大家好,前段时间开始学习ArcEngine,看了一些基础概念,但遇到了QI这个概念不是很清楚,今天在网上看了一些资料,理解了其中的缘由,不敢独享,特写出来与大家一块分享,希望对和我一样的初学者有所帮助。

    对于了解AE的开发人员来说,都知道AE都是基于接口(interface)进行编程的。AE中所有的类(Class)都是通过接口实现的,我个人认为这是一个极好的架构,对于扩张程序是极其方便的。比如说,当我要自定义一个地图操作类时,我就可以使用AE中定义好的接口,实现这些接口的属性和方法就可以了。但是当我们不用接口,而是将它全部都写成为类,这在后期要实现更改类的方法或是属性时,后期的维护工作可想而知有多大了。但对于接口来说,就不一样了,我们可以在接口中定义属性和方法,再让这些类实现这些属性和方法便可,不需要对类做大手术,既节省时间,又节约了成本,何乐而不为呢。呵呵。

    讲了这么多,就是想说一点使用接口的好处。但往往好处多的东西,往往理解起来不是那么容易。就比如说接口查询(QI):同一个类中不同接口之间的转换。即:在一个类实现了多个接口,从类中的一个接口跳转到另外一个接口的过程就是QI(接口查询)。

    在这里,我主要提两点:1.接口查询(或者叫接口转换)是针对同一个类实现的接口来说的,不同的类实现的接口之间是不能进行QI的。例如,类A实现(继承)了接口IA1,IA2,IA3,IA4。类B实现(或者继承)了接口IB1,IB2,IB3,IB4。那么类A中的四个接口(A1~A4)之间是可以进行接口查询的,类B的四个接口(B1~B4)也是可以进行接口查询的,但是类A实现的接口与类B实现的接口之间是不能进行接口查询的,即:接口查询仅限于同一个类实现的多个接口之间。
接口查询(或者叫接口转换)是针对同一个类实现的接口来说的,不同的类实现的接口之间是不能进行QI的。例如,类A实现(继承)了接口IA1,IA2,IA3,IA4。类B实现(或者继承)了接口IB1,IB2,IB3,IB4。那么类A中的四个接口(A1~A4)之间是可以进行接口查询的,类B的四个接口(B1~B4)也是可以进行接口查询的,但是类A实现的接口与类B实现的接口之间是不能进行接口查询的,即:接口查询仅限于同一个类实现的多个接口之间。
     2.为什么要进行接口查询?当我们用new关键字实例化了一个类,并将该类实例的引用保存到一个接口类型的变量里面(注:该类实现了该接口),如:IA1 a1=new A();我们知道类A实现了四个接口,但是,对象A目前所能使用的方法和属性就只有接口IA1中所定义的属性和方法,而不能使用其他三个接口所定义的属性和方法。但是,如果我们还想使用其它三个接口(IA2,IA3,IA4)所定义的方法和属性,那么这个时候就要用到QI。
      下面我们借用别人写的两个例子来具体地解释一下QI的使用。
我们首先自己定义两个接口和一个类,具体如下:
//自定义两个接口
        interface IMap
        {
            void ClearLayers();
        }
        interface IActiveView
        {
            void Clear();
        }
        //定义了一个类,该类继承了上面定义的两个接口
        class MapClass:IMap,IActiveView
        {
             void IMap.ClearLayers()
            {
                MessageBox.Show("执行了ClearLayers方法");
            }
             void IActiveView.Clear()
            {
                MessageBox.Show("执行了Clear方法");
            }
        }
        private void btntest_Click(object sender, EventArgs e)
        {
            IMap pMap=new MapClass();//实例化了类MapClass,并将对象的引用保存的IMap类型的变量里面
            pMap.ClearLayers();//调用了接口IMap所定义的方法
          pMap.Clear();//如果我们这样调用接口IActiveView里面的方法,会出现编译错误。原因是在接口IMap里面根本就没有定义Clear()这个方法。目前,类实例所能使用的方法就只有ClearLayers()这个方法,如果我必须使用Clear()这个方法怎么办呢?这时候QI就该发挥它的威力了。
            IActiveView pActiveView = pMap as IActiveView;//进行了QI
()
            pActiveView.Clear();
        }
        今天就说到这里,刚开始学习,如有不妥之处,请各位网友批评指正,共同进步。有些内容参考了网上的一些资料。特次说明。

作者: gis追梦者 发表于 2011-03-08 23:45 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"