C#委托实践(理解---转自:http://wangjierui.blog.51cto.com/186879/41225)
来源:互联网 发布:shell中数组的使用 编辑:程序博客网 时间:2024/05/08 08:00
我牵头,你做事——C#委托实践一
2007-09-05 23:54:54
标签:委托 [推送到技术圈]
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wangjierui.blog.51cto.com/186879/41225
计算机在不断的模拟人类现实世界,总有一天,在这个世界上将无法区分谁是计算机,谁是原生人……
(以下文字纯属个人理解,酌情参考)
直到如今,我们在管理上习惯于大包大揽,对事情总是喜欢制定出绝对的计划,非得弄出个一二三,然后对下属分配好任务,下属需要的只是服从,按照计划执行就可以了。而这样的工作方式,往往不能适应实际情况的变化。早在战国时期,就有“将在外,君命有所不受”的觉悟了,说这话的人如果做软件,将是功能扩展性编程的始祖。所谓功能扩展性编程就是将功能的具体实现放到程序外。如果我们在程序设计的时候,无法预料对于某个事件的处理程序究竟是什么样的,那就“委托”给使用者去自行处理,当然,使用者必须和我们签订一份协议,遵循我们的规范。把这个理念放到C#编程中,就是委托(Delegate)。
比如,我们最常用的控件之一——Button,微软在制作这个控件的时候,对于点击事件已经实现了一部分功能,那就是压下去又弹上来。可是我们拽一个按钮到窗体上,当然不是看它弹上弹下的,而是希望他能处理某些功能,比如张三想用来播放一首歌,李四想用来弹出另外一个窗体等等。对于这种情况,微软干脆来了个委托,把责任推卸给开发人员自己去实现,出了问题,开发人员难逃其咎,这招实在是高明。要不然我们怎么办?难道要微软开发一个点击后可以播放音乐的按钮?或者点击可以弹出一个窗口的按钮?活都让微软做了,我们程序员还靠什么吃饭^_^
说了这么多,委托也就差不多清楚了。委托协议将原计划与实际活动联系起来,落实到编程语言中就是用指针将各个实现方法联系起来。比如Button控件在原有的压下弹上的功能基础上,用EventHandler委托关系连接到Button_Click上,就实现了一连串动作:压下,弹上来,播放一段音乐。当然我们可以用“多播”的方式,关联到更多的功能上去,就和串糖葫芦一样。记住,糖葫芦是有顺序的。
今晚碰到了一个问题,想来想去用委托实现最为简单,拿出来作为一个应用例子吧:
我在一个解决方案中,使用了A,B,C三个程序集,其中依赖关系如上图。本来,我在A中有如下代码
if(C.Method()) A.Method();
即A依赖于C的某个动作而需要作出反应。后来,我在B中也需要做如上动作,但如何在B中使用A的代码呢?在尽量避免互相引用的原则下,虽然考虑到用反射,但是最终觉得用委托是最方便的解决方案。
既然动作都是由C牵头的,则由C做一个委托类型,A中实现C的委托。这样的话,如果B找C做事情,C做了自己该做的,剩下的就委托给A来做,间接实现B调用A的代码。这也是设计模式中常用的手段,在很多场合,委托可以代替接口实现间接调用。
本文出自 “王杰瑞的技术博客” 博客,请务必保留此出处http://wangjierui.blog.51cto.com/186879/41225
本文出自 51CTO.COM技术博客- C#委托实践(理解---转自:http://wangjierui.blog.51cto.com/186879/41225)
- 创建windows域---深入理解域概念(转自:http://angerfire.blog.51cto.com/)
- sha1加密(C# VS2005)(转自:http://yardan.blog.51cto.com/304821/60705)
- 转自51cto(http://smailes.blog.51cto.com/rss.php?uid=28248)
- asp.net内置对象(转自:http://zhoufoxcn.blog.51cto.com/792419/166803)
- asp.net内置对象(转自:http://zhoufoxcn.blog.51cto.com/792419/166803)
- iscsi共享存储 转自:http://aceruser.blog.51cto.com/2772529/668593
- RESTful入门——转自http://lavasoft.blog.51cto.com/62575/229206/
- matlab环境下使用libsvm,转自http://apinetree.blog.51cto.com/714152/1560254
- Linux 安装时,如何选择包?【转自http://oldboy.blog.51cto.com/2561410/1564620】
- 关于c#里的string 类型(转http://xianyun0216.blog.51cto.com/714887/167194)
- C#读取配置文件浅析(转自:http://developer.51cto.com/art/200908/143706.htm)
- http://enchen.blog.51cto.com/716040
- http://xcshen.blog.51cto.com/流媒体
- http://cxxsoft.blog.51cto.com
- Java虚拟机(JVM)参数配置说明(转自:http://lavasoft.blog.51cto.com/62575/25492)
- IHttpModule.Init会被调用多次的原因(转自:http://lidup.blog.51cto.com/426277/140338)
- Sqlite 当前时区的当前时间(转自:http://wanqiufeng.blog.51cto.com/409430/477648)
- 获取iframe中子窗体的title
- 打造symbian开机自启动程序
- Jsp中的Exception对象
- OA走向衰老,工作流管理正显青春
- JSP联系XML与数据库
- C#委托实践(理解---转自:http://wangjierui.blog.51cto.com/186879/41225)
- 试释 VC 如何调用com
- 第一个属于自己的博客
- Oracle修改用户密码的方法
- 三态的定义
- 【转】敏捷开发中编写高质量Java代码
- 调心算法
- ie引用js文件出现中文乱码的一种解决方法
- VC智能感知 clw ncb bsc文件的作用[zz]