ArcGIS Engine中QI(查询接口)的多角度思考解析

ArcGIS Engine中QI(查询接口)的多角度思考解析

令人头疼的A as B

     本人在C#基础很一般的情况接触了AE,代码中接口之间的A as B 这种东西频繁的出现,什么意思?对这个现象十分头疼,一查才知道这叫QI(查询接口)。结合查到的资料和自己的思考,写出如下一篇对QI来龙去脉的分析,希望对大家有所帮助,本文由浅薄之处望见谅,错误之处恳请高手指出,感谢!       

面向接口的AE


      AE中多数的对象通过接口和实现类进行创建。一个实现类一般实现了相当多的接口,为了避免所实现的接口出现方法重名,另外对这些方法有好的分类,故把实现类对象赋值给接口类型的对象,而不是直接用类来创建对象。由于创建的对象是某个接口类型的,则这个对象就只能调用实现类中实现的这个接口中的方法。而如果想调用实现类中实现的其他接口的方法,就需要用到QI(查询接口)。下面用几行代码作为实例进行分析。
                  ***以下代码中对原项目的代码做出改动,以便于本例的讲解,不可直接移植使用***
IMap pMap = new MapClass();
IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;
IActiveView pActiveView = pGraphicsContainer as IActiveView;

       
pMap就是以接口IMap和实现类MapClass创建的一个对象,无奈pMap只能调用IMap接口里的方法。
如果想调用MapClass这个类实现的其他接口的方法怎么办?第二行代码将pMap(IMap接口类型)转换为IActiveView接口类型,第三行将 pActiveView(IGraphicsContainer接口类型)转换为IActiveView接口类型。

任性的类型转换


       两个接口类型缘何能进行如此任性的类型转换?这有关C#语言基础里面as关键字的知识,而由于AE中面向接口的设计(一个实现类往往实现了N多个接口),这种语言基础知识得以更好的讲解。(注:下文中的IA代表A接口,IB代表B接口,C代表同时实现了这两个接口的实现类C)

      上面这两张图看的很清楚,MapClass类同时实现了IMap接口,IGraphicsContainer接口,IActiveView接口。也就是说,A as B这种查询接口的用法(实际上是把一种接口类型对象的引用转换为了另一种接口类型)是在IA和IB两个接口被同一个实现类C实现的前提下使用的。本例中第二行代码IA就是IMap类型,IB就是IGraphicsContainer类型。第三行代码IA就是IGraphicsContainer类型,IB就是IActiveView类型。而这两行代码的C自然是MapClass。此时利用抽象的IA,IB和C解释AE的设计以及由此引发的QI用法的目的就很容易了。

脚踩N条船——QI


       由于面向对象的编程(尤其是像AE这种二次开发)在操作层面的基本思想就是:创建对象→调方法,创建对象→调方法...进行二次开发自然是各种调方法得以实现各种功能,这自然无需多说。而创建对象由于前文提出的AE设计的缘故,都通过接口来创建。于是就出现了下面这一幕:用IA和C创建了一个对象pA,调了一堆接口A中的方法...然后不满足了,想调用IB中的方法,好吧...pA as IB就生生把这个对象引用变成了B接口类型的(再次提醒,IA和IB都被C实现类实现),你现在可以调用IB中的方法了。还不满足?你可以接着转,上面的图上也看到了MapClass实现了那么多接口,你想转你就可劲儿地转,只要你转化后的接口是被MapClass实现了的。这个转换,就是AE中所谓的QI。

生活中的QI——"变脸"


     另外,可以把实现的这众多接口看做是MapClass的基类,或者是父类。这样理解的话,可以从语言的角度去理解QI.这其实类似一种“变脸”:as在英语中有作为的意思。举个例子,作为一个的大学生,你有爹,有妈,有叔,有老师...他们都是你的长辈,可以理解为接口和父类。你自己实现了你爹,你妈,你叔,你老师这些接口。但是不同的情况下,你的身份可以作为(as)你爹的儿子,作为(as)你妈的儿子,作为(as)你叔的侄子,作为(as)你老师的学生。而你自己则实现了所有这些接口的方法,只是不同情形身份不同,就变个脸。先根据儿子的身份创建一个对象,跟老爸相处,调用儿子接口的方法。到了学校作为(as)老师的学生,调用学生接口的方法,过年串亲戚见了叔,就作为(as)侄子,调用侄子接口的方法。但是能转换的前提就是,同样是你一个人,具有多重身份。你如果没有王思聪的哥们儿这种身份(相当于你没有实现这个接口),你就作为(as)不了这种身份,又或者你的室友(这就是另一个类)就不能乱转你的身份了。你看,AE里的QI跟生活里的“变脸”是不是很很像?

    以上通过C#类和接口的关系,AE中的设计和代码示例,以及英语本身和社会生活中的结合三个维度帮大家理解了一下QI这个概念。当然这只是我个人的理解,如有浅薄和错误之处,恳请指出。感谢!
                                                                                                                                                         --By 秦有道

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值