关于C#中ArcGIS Engine接口的 as 和 is 关键字
一、 as 关键字
msdn: as 运算符类似于强制转换操作。
个人理解:
二、 is 关键字
msdn:检查对象是否与给定类型兼容。例如,可以确定对象是否与 string 类型兼容,如下所示:if (obj is string)。这里的"兼容"表示对象是该类型,或者派生于该类型。请注意,is 运算符只考虑引用转换、装箱转换和取消装箱转换。不考虑其他转换,如用户定义的转换。
个人理解: 如果 is 运算符后面为一个对象的话,完全可以按上述方法直观理解;如果是一个接口的话,问题可能有点复杂,举例说明如下:
Aobject类,含有IA、IB接口。 另外, ASunobject为Aobject类子类,它除了Aobject类的IA、IB接口外,还有IC,IM接口。除此之外还有一个类Bobject,它含有IC,IZ, IX接口。
现在的问题是这样的:
Aobject pASunInst= getSunObj();//其中getSunObj()为外部的一个方法,它得到一个ASunobject类对象。
//根据对象多态性,上述的可以轻松理解。
if(pASunInst is IC)
{
//该if肯定为True
}
具体的理解过程下:因为ASunobject 类的 pASunInst 对象实现了 IC接口,所以为True。当遇到的 is 判断可以理解为当前对象有没有实现这个接口,即当前对象的类有没有包含这个接口。如上述例子pASunInst对象 对应的类为 ASunobject类,它包含IC接口。
可能您还有疑问:上述pASunInst不是Aobject 类吗,它并没有包含IC ? 是的,它申明对象的时候是Aobject 类的对象,但是它实例化的是ASunobject类的对象【因为getSunObj()返回ASunobject对象】,根据多态性原理,赋值后的pASunInst为ASunobject对象,所以上述 if 就为true了。
现在将问题稍微的变换一下:
IA pASunInst= getSunObj();//其中getSunObj()为外部的一个方法,得到的是一个ASunobject类对象。
//但是它返回的是一个ASunobject对象中的一个接口IA。
通俗的比喻: ASunobject对象就像一个房子,包含有各种各样的东西,如:窗户、椅子、床等等实物,而IA、IB、IC、IM接口就相当于它的窗户,外面的人是通过这些扇窗户了解里面的房子。一扇窗户看到的东西是有限的,这和接口一样它只是看到的房子内的一部分东西。当然如果你想看到房子内的所有东西的话,你可以绕着房子一一看每个窗户,如果你通过设计图的话可以直接知道你感兴趣的东西可以在那个窗户上看到它,这个过程就是通过接口中的as 关键字来实现,即QI。 而具体找窗户就是is 关键字的过程。【设计图:如AO的对象模型设计图】
if(pASunInst is IC)
{
//该if肯定为True
}
现在这句 If 判断语句很好理解吧:就是包含IA 这个窗户的房子有没有包含 IC这个窗户。
专业点意思为:包含IA接口的对象有没有包含IC对象
具体转化为ArcGIS Engine的例子:
例如,axMapControl1地图控件中的第3层是一个矢量的道路层数据。我们就可以这样做
ILayer pLayer = this.axMapControl1.Map.get_Layer(2);
if (pLayer is IFeatureLayer)
{
//因为第3层是一个矢量的道路层数据,所以该if 就为true
IFeatureLayer pFeatureLayer = pLayer as IFeatureLayer;
}
解释如下:专业解释:this.axMapControl1.Map.get_Layer(2)得到的是FeatureLayer对象的ILayer接口,FeatureLayer对象肯定实现了IFeatureLayer【可以通过AO的对象模型图查看对象和接口的关系】,所以 IS 为True。
通俗解释:this.axMapControl1.Map.get_Layer(2)得到的为名叫"FeatureLayer"的房子,通过AO的对象模型图可以知道它有"ILayer "窗户,同时也有" IFeatureLayer"窗户,即能找到" IFeatureLayer"窗户。所以 is 为True。
<未完待续>