arcgis engine 开发之QI
ArcGIS Engine开发基础之QI
AO开发中QI(接口查询)非常重要,从某种意义上说不会QI就不会做AO开发。
在讲ArcGIS Engine开发QI实例操作之前,以一个现实生活例子以方便大家理解QI。
1.首先我先定义三个接口:IZou(走),IJingzou (竞走),IHeshui(喝水)如下所示
interface IZou
{
void start();
void stop();
}
interface IJingzou :
IZou
{
void niupigu();
}
interface IHeshui
{
void heshui();
}
2.定义一个人类实现IZou(走)IHeshui(喝水)两个接口
class person : IZou,
IHeshui
{
void IZou.start()//注:显式接口实现后边会讲到
{
MessageBox.Show("开始走");
}
void IZou.stop()
{
MessageBox.Show("停止走");
}
void IHeshui.heshui()
{
MessageBox.Show("开始喝水");
}
}
3.定义一个运动员类继承于人类实现IJingzou 接口
class yundongyuan :
person, IJingzou
{
void IZou.start()
{
MessageBox.Show("开始走");
}
void IZou.stop()
{
MessageBox.Show("停止走");
}
void IJingzou .niupigu()
{
MessageBox.Show("开始扭屁股");
}
}
定义完接口与类,接下来我给大家演示QI
1.实例化一个person类。
IZou pZou = new person();
pZou.start();
IJingzou pJIngzou = pZou as
IJingzou ;//进行QI
pJIngzou.niupigu();//将会出错如下图所示
为什么会出现这个错误是因为用new实例化了一个人,但是并不是所有的人都会竞走的也就是说Person这个类没有实现IJingzou 这个接口所以报错。所以做QI之前必须查看你实例化的类是不是实现了相关接口。
2.实例化一个yundongyuan
IZou pZou = new yundongyuan();
pZou.start();
IJingzou pJIngzou = pZou as
IJingzou ;
pJIngzou.niupigu();//将会执行如下图
通过实例化一个yundongyuan之后我就可以通过IZou接口直接QI到Ijingozu这个接口,然后执行Ijingozu接口所提供的方法这就是QI。
3.Ok我们现在我们再在第二部做个补充,运动员开始扭屁股竞走了,竞走运动员在竞走过程中太渴想喝水怎么办?痛过QI切换到IHeshui接口执行喝水方法即可,如下例
IZou pZou = new yundongyuan();
pZou.start();
IJingzou pJIngzou = pZou as IJingzou ;
pJIngzou.niupigu();//将会执行
IHeshui pHeshui = pJIngzou as
IHeshui;//QI到IHeshui接口
pHeshui.heshui();//运动员将喝水
上边这个实例演示完,大家对QI会有所了解,那么如何在ArcGIS Engine开发中使用QI呢?接下来我以一个功能实例来演示一下QI在ArcGIS Engine开发中的使用。
下图在地图控件上有两个图层:一个面图层在上,一个是等高线图层在下
我们实现一个小功能,让面图层为半透明图层能够看到下边等高线图层,代码如下:
privatevoidbutton1_Click(objectsender,EventArgse)
{
//获取第一个图层
ILayerpLayer =this.axMapControl1.get_Layer(0);
if(pLayerisIFeatureLayer)//如果第一个图层时矢量图层
{
ILayerEffectspLayerEffects = pLayerasILayerEffects;//进行QI,查询到ILayerEffects接口
pLayerEffects.Transparency =
65;//设置ILayerEffects接口的Transparency属性使该矢量图层的透明度属性为65.
}
}
通过以上操作第一个矢量图层有一定的透明度,可以看到面图层下边的等高线线图层,结果如下图所示:
分析:
首先地图控件上的第一个图层是一个矢量图层是一个FeatureLayerClass对象,在ArcGIS Engine帮助文档可以看到在FeatureLayerClass这个类实现了ILayer和ILayerEffects这两个接口,那么就可以直接从ILayer接口查询到ILayerEffects接口。
大家可能会有这样的疑问:
为什么不直接使用类的全权名直接调用FeatureLayerClass的方法的调用、属性访问?因为FeatureLayerClass里实现相关接口的方法,属性的实现是,以显式接口的方式实现的。
例如在第一个实例中如果我们
person pperson = new person();
pperson.start();//将会编译错误,不能通过类的全权名进行方法的调用,只能用接口实例来访问。
接下来可能还有一个疑问:为什么要用显式实现接口的方法?
这样做有以下两个目的:
1.隐藏类的复杂性
因为显式接口成员实现不能通过类或结构的实例来访问,所以它们可以用来隐藏某些成员。因为接口的成员都是公共的,可以被任意地访问,所以当想要对外隐藏接口时,就需要使用显式接口成员实现。
2.可以用来解决具有相同签名的成员之间的冲突
例如FeatureLayerClass这个类实现了ILayer和IFeatureLayer这两个接口,而这两个接口都有AreaOfInterest属性那么通过显式接口我就可以避免同名发生的混淆。
总结,当我们在开发时对某个对象(FeatureLayer,FeatureClass,Element等)进行操作实现功能开发时我们应该先看看你所操作的类实现了那些接口,从帮助中浏览相关接口的功能描述,然后再查询所要调用的方法。如果还需调用另外一个接口操作则进行QI。
arcgis engine 开发之QI的更多相关文章
- ArcGIS Engine开发之旅04---ARCGIS接口详细说明
原文:ArcGIS Engine开发之旅04---ARCGIS接口详细说明 ArcGIS接口详细说明... 1 1. IField接口(esriGeoDatabase)... 2 2. ...
- ArcGIS Engine开发之旅10--空间参考及坐标转换
原文:ArcGIS Engine开发之旅10--空间参考及坐标转换 空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确 ...
- ArcGIS Engine开发之旅09--几何对象和空间参考
原文:ArcGIS Engine开发之旅09--几何对象和空间参考 1.Geometry Geometry 是 GIS 中使用最为广泛的对象集之一,用户在创建.删除.编辑和进行地理分析的时候,就是处 ...
- ArcGIS Engine开发之旅08--和查询相关的对象和接口
原文:ArcGIS Engine开发之旅08--和查询相关的对象和接口 查询在GIS领域应该是一个很频繁的操作,在GIS中除了具有属性查询(和其他关系型数据库的查询类似),还提供了空间查询.在介绍查询 ...
- ArcGIS Engine开发之旅07---文件地理数据库、个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 、打开栅格数据
原文:ArcGIS Engine开发之旅07---文件地理数据库.个人地理数据库和 ArcSDE 地理数据库中的栅格存储加以比较 .打开栅格数据 对文件地理数据库.个人地理数据库和 ArcSDE 地理 ...
- ArcGIS Engine开发之旅05---空间数据库
原文:ArcGIS Engine开发之旅05---空间数据库 1 Geodatabase概念 Geodatabase是ArcInfo8引入的一种全新的面向对象的空间数据模型,是建立在DBMS之上的统 ...
- ArcGIS Engine开发之旅03--ArcGIS Engine中的控件
原文:ArcGIS Engine开发之旅03--ArcGIS Engine中的控件 制图控件,如MapControl.PageLayoutControl,其中MapControl控件主要用于地理数据的 ...
- ArcGIS Engine开发之旅02--ArcGIS Engine中的类库
原文:ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...
- ArcGIS Engine开发之旅01---产品组成、逻辑体系结构
原文:ArcGIS Engine开发之旅01---产品组成.逻辑体系结构 ArcGIS Engine 由两个产品组成: 面向开发人员的软件开发包(ArcGIS Engine Developer k ...
随机推荐
- 不逃离WIndows,Asp.Net就只能写写进销存管理系统
那个丹麦人把C#语言弄的再好,但是如果程序放进Windows+IIS这个容器,就有问题了. 我在I5+8G内存的机子上测试Windows2008+IIs,直接ab 2000并发压默认的HTML主页,还 ...
- matlab实现贝塞尔曲线绘图pdf查看
贝塞尔曲线绘图方法: %Program 3.7 Freehand Draw Program Using Bezier Splines %Click in Matlab figure window to ...
- Java架构师之路:JAVA程序员必看的15本书
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...
- 分布式文件系统 - FastDFS
分布式文件系统 - FastDFS 别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白 ...
- 怎么直接在MySQL客户端上执行SQl文件?
\. 直接把sql文件拖进去就行了,(斜杠+.+空格+sql文件)
- ffmpeg 从视频流中抓取图片
从视频中不断抓取图片的基本流程:打开视频流地址->获取视频流packt->解码成图片帧->输出图片 一.初始化Ffmpeg void ffmpegInit(){ av_registe ...
- 在ubuntu16.04 下安装haproxy 1.5.11 做tcp负载均衡
由于haproxy需要FQ下载,所以从csdn下载了较为新版的haproxy1.5.11,安装过程如下: 1. 解压haproxy-1.5.11.tar.gz : tar xzvf haproxy-1 ...
- JavaScript高级---适配器模式
一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...
- QC缺陷管理操作-细说(转)
一.缺陷常用字段说明 二.缺陷管理流程图 三.开发人员修改缺陷填写规范 四.项目经理决定延期修改缺陷 一.缺陷常用字段说明 1.摘要 对缺陷的简单描述.摘要包括该缺陷所属的模块名称-子模块名称,以及简 ...
- spoj 138
离散化 去掉重复点 排序 二分查找 #include<cstdio> #include<cstring> #include<algorithm> #define ...