接口编程与QI

     COM中,和我们打交道的是接口,也就是说类对我们是隐形的,那么我们要做开发,要使用这些功能,我们只能通过接口,通过接口暴露出来的方法,COM 是一种服务器端/客户端架构,服务器端定义了操作的方法,客户端通过接口调用这些方法。

     一个接口可以被多个类实现,而 QI 要解决的就是一个类实现多个接口的问题。在 COM中,接口定义了方法,类实现了接口中定义的方法,而一个接口只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情,这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface)。

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

    在这里,我主要提两点:1.接口查询是针对同一个类实现的接口来说的,不同的类实现的接口之间是不能进行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();
        }
        今天就说到这里,刚开始学习,如有不妥之处,请各位网友批评指正,共同进步。有些内容参考了网上的一些资料。特次说明。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值