接口查询(QI)心得

Technorati 标签: , ,

ArcObjects开发基础与技巧 for VB.NET》中提到:

Dim pGraphicsContainer As IGraphicsContainer

pGraphicsContainer=pActiveView.FocusMap

pGraphicsContainer '对象现在可以使用的属性和方法就只能是IGraphicsContainer接口定义的那部分,而不能使用其他接口定义的方法和属性,那如何使用其他接口定义的属性和方法呢?这就是所谓的QI(Query InterFace)功能,即从对象的一个接口查询另一个接口定义的属性和方法,如:

Dim pActiveView as IActiveView

pActiveView=pGraphicsContainer'通过上面的操作,pActiveView现在就可以使用MAP类中IActiveView接口定义的属性和方法了,这就实现了在一个类的不同接口之间的转换 
起初不太明白。后来到ERSI中文论坛上看到一个回复,茅塞顿开。

Map类实现了IGraphicsContainer和IActiveView接口,这两个接口都只能使用Map类的一部分属性和方法(也就是实现该接口时需要的属性方法)。那么通过IGraphicsContainer来得到IActiveView就是QI。


举个例子,类ClassA实现了接口Ia1,Ia2 :

Ia1 a1=new ClassA( );    //在内存中开辟了一个空间用于新建ClassA( ),所需空间的大小仅与类有关,与接口无关。
这样a1就可以使用类实现的该接口的方法,但不能使用类所实现的Ia2的方法。 如果要使用Ia2,那么可以再新建一个对象。
la2 a2=new ClassA( );   //重新开辟了一个空间来新建类。a2可以使用对应于Ia2接口的方法。

但新建的这两个对象是独立的,对第一个对象仅能使用Ia1的方法对其进行管理;对于第二个对象仅能使用Ia2的方法对其进行管理。显然,这不是我们想要的。这时就可以进行接口查询。

Ia1 a1=new ClassA( );   //新建一个对象

Ia2 a2=a1 as Ia2;       //QI,a2与a1同时指向上一句所新建的对象,用各自接口中的方法对该对象进行管理。

你可能感兴趣的:(接口)