面向对象基础-委托与事件

首先举一个实例:
创建一个控制台程序,需求是:有一只猫Tom,有两只老鼠Jerry和Jack,Tom只叫一声“喵,我是Tom”,两只老鼠就说“老猫来了,快跑”,我们来分析一下:
我们需要Cat和Mouse类两个类,当Cat的Shout方法触发的时候,Mouse就执行Run方法,不过这里如何让Shout触发式,通知两只老鼠呢?显然老猫不会通知老鼠“我来了,你们快跑”。
所以,我们在Cat类中,不应该关联Mouse类的。这个时候,委托事件就是最好的处理方法了。
委托是对函数的封装,可以当作方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事件时,时间对象处理通知过程。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托用关键字delegate来声明,而事件就是说在发生其他类或者对象关注事件时,类或对象可通过事件通知他们,事件的关键字 用event声明。

   1:      class Cat2 
   2:      { 
   3:          private string name; 
   4:          public Cat2(string name) 
   5:          { 
   6:              this.name = name; 
   7:          } 
   8:          public delegate void CatShoutEventHandler(); 
   9:          public event CatShoutEventHandler CatShout; 
  10:          public void Shout() 
  11:          { 
  12:              Console.Write("喵,我是{0}.", name); 
  13:              if (CatShout != null) 
  14:                  CatShout(); 
  15:          } 
  16:      } 
  17:   
  18:       class Mouse 
  19:      { 
  20:          private string name; 
  21:          public Mouse(string name) 
  22:          { 
  23:              this.name = name; 
  24:          } 
  25:          public void Run() 
  26:          { 
  27:              Console.WriteLine("老猫来了,{0}快跑!", name); 
  28:          } 
  29:      } 
  30:   
  31:          static void Main(string[] args)
  32:          {
  33:              Cat2 cat = new Cat2("Tom");
  34:              Mouse mouse1 = new Mouse("Jerry");
  35:              Mouse mouse2 = new Mouse("Jace");
  36:              cat.CatShout += new Cat2.CatShoutEventHandler(mouse1.Run);
  37:              cat.CatShout += new Cat2.CatShoutEventHandler(mouse2.Run);
  38:              cat.Shout();
  39:              Console.Read();
  40:          }

 

new Cat2.CatShoutEventHandler(mouse1.Run)的含义是实例化一个委托,而委托的实例其实就是Mouse的Run方法。而“cat.CahShout += ”表示

cat.add_CatShout(new Cat2.CatShoutEventHandler(mouse1.Run))的意思。
运行的结果:
 

我们平时在点击一个按钮的时候,通常看到这样子的东西:

private void button5_Click(object sender, EventArgs e)

这里的sender和e有什么用呢?
我们首先修改一下上面的例子

   1:      class Cat2
   2:      {
   3:          private string name;
   4:          public Cat2(string name)
   5:          {
   6:              this.name = name;
   7:          }
   8:          public delegate void CatShoutEventhandler(object sender, CatShoutEventArgs args);
   9:          public event CatShoutEventhandler CatShout;
  10:          public void Shout()
  11:          {
  12:              Console.Write("喵,我是{0}.", name);
  13:              if (CatShout != null)
  14:              {
  15:                  CatShoutEventArgs e = new CatShoutEventArgs();
  16:                  e.Name = this.name;
  17:                  CatShout(this, e);
  18:              }
  19:          }
  20:      }
  21:   
  22:      class Mouse
  23:      {
  24:          private string name;
  25:          public Mouse(string name)
  26:          {
  27:              this.name = name;
  28:          }
  29:          public void Run(object sender, CatShoutEventArgs args)
  30:          {
  31:              Console.WriteLine("老猫{0}来了,{1}快跑!", args.Name, name);
  32:          }
  33:     }

 

Main函数不变。这个时候的结果是:

9

转载于:https://www.cnblogs.com/chenamo5776/archive/2011/11/13/2247177.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下wget的用法

2019独角兽企业重金招聘Python工程师标准>>> Linux wget是一个下载文件的工具,它用在命令行下。对于Linux用户是必不可少的工具,尤其对于网络管理员,经常要下载一些软件或从远程服务器恢复备份到本地服务器。如果我们使用虚拟主机…

【传智播客】Libevent学习笔记(三):事件循环

目录 00. 目录01. event_base_loop函数02. event_base_dispatch函数03. event_base_loopexit函数04. event_base_loopbreak函数05. event_base_got_exit函数06. event_base_got_break函数07. event_base_dump_events函数08. event_base_dump_events函数09. 废弃的事件循环函数1…

Android的MVC框架

http://www.cnblogs.com/wanghafan/archive/2012/07/20/2600786.html MVC是当前比较流行的框架,随便Google下,就可以发现几乎所有的应用程序开发中都采用了MVC框架,例如:.NET,Java Spring,Java Struts&…

DVWA-SQL注入

SQL注入解题思路 寻找注入点,可以通过web扫描工具实现通过注入点,尝试得到连接数据库的用户名,数据库名称,权限等信息。猜解关键数据库表极其重要字段与内容。通过获得的用户信息寻找后台进行登录。利用后台上传webshell或一句话木…

easyui验证:validatebox

2019独角兽企业重金招聘Python工程师标准>>> $.extend($.fn.validatebox.defaults.rules, { eqTrim : {/* 填写名字前面不能有空格! */ validator : function(value,param) { var reg new RegExp(param); var falg!reg.test(value); return falg; }, me…

秒懂机器学习---当机器学习遇上决策树....

秒懂机器学习---当机器学习遇上决策树.... 一、总结 一句话总结: 多多看图,图的直观效果很好,很多时候文字实在表达不清 1、决策树(Decision Tree)中的各个节点表示什么意思? 每一个树节点表示一个属性上的…

Linux系统目录结构及主要内容

为什么80%的码农都做不了架构师?>>> 文件结构 : /:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。 /bin: bin 就是二进制(b…

学习《深度学习入门:基于Python的理论与实现》高清中文版PDF+源代码

入门神经网络深度学习,推荐学习《深度学习入门:基于Python的理论与实现》,这本书不来虚的,一上来就是手把手教你一步步搭建出一个神经网络,还能把每一步的出处讲明白。理解神经网络,很容易就能入门。 深度学…

学习《PythonWeb开发实战(董伟明)》中文PDF+源代码

python可以用了进行数据分析,也可以进行Web开发,一般会使用django或者flask等进行开发。 国内介绍python web的书有写的不错的,推荐看看《PythonWeb开发实战》 他的定位是进阶读者,介绍了Python web的生态,有些包介绍得…

周鸿祎:在360新员工入职培训上的讲话

这个是周鸿祎给入司360新员工的一段话,不但适合360,也适合所有的公司员工。特此分享。我想给新入职的同事讲一讲我的期望,再提几个建议。我这个人喜欢说真话,不喜欢说漂亮话,因为漂亮话没用。但说真话,大家…

使用面向对象技术创建高级 Web 应用程序

作者: 出处: 使用面向对象技术创建高级 Web 应用程序 来源:开源中国社区 作者:oschina最近,我面试了一位具有5年Web应用开发经验的软件开发人员。她有4年半的JavaScript编程经验,自认为自己具有非常优秀的JavaScript技能&#xff…

DevExpress控件使用经验总结

DevExpress控件使用经验总结 DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件。本文主要介绍我在使用DevExpress控件过程中,遇到或者发现的一些问题解决方案,或者也可以所示一些小的经验总结。总体来讲&…

第二阶段团队绩效评分

第二阶段评分结果: 转载于:https://www.cnblogs.com/xczd/p/11068692.html

随堂小测冲刺.第19天

我们小组的logo出来的,太酷了,不符合我的审美,本人表示无法接受。。。 还要谢谢李泽宇的女盆友,O(∩_∩)O哈哈~ 转载于:https://www.cnblogs.com/daisy99lijing/p/11024465.html

MSBuild编译扩展

新增一个C#工程&#xff0c;用记事本打开工程文件&#xff08;.csproj结尾&#xff09;&#xff0c;滚动条拉到最后&#xff0c;大家可以看到一段如下的代码&#xff0c;其中<Target Name"BeforeBuild">和<Target Name"AfterBuild">大家根据名…

修改2440里面的FriendlyARM

修改2440里面的FriendlyARM 在/etc/init.d文件夹里面有一个rcS文件&#xff0c;修改/bin/hostname FriendlyARM中的FriendlyARM即可 比如修改为/bin/hostname Solar posted on 2011-12-07 17:22 Neddy11 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Neddy…

vs2008 下编译jrtplib-3.9.0成功

网址:http://blog.csdn.net/jid_223/article/details/6858663 jrtplib-3.9.0的编译&#xff0c;终于搞通了。网上搜集了很多资料&#xff0c;自己也调试了很久。 首先&#xff0c;jrtplib-3.9.0是什么不用多说吧&#xff0c;它是一个很牛的老外用C写的一个开源的RTP协议库&…

Eclipse安装VJET报错解决办法

2019独角兽企业重金招聘Python工程师标准>>> Eclipse在安装JS编辑器插件VJET时可能会出现以下错误 Cannot complete the install because one or more required items could not be found. Software being installed: VJET Java Based Dom Kit (Incubation) 0.10.0…

罐头瓶里面的电能表

生活中我们经常见到数字电能表&#xff0c;只不过下面这个是装在罐头里面的电能表&#xff0c; 此想法来自EnterJar&#xff0c;&#xff0c; 怎么样&#xff1f;直接把用电器接上就可以测出电子产品的电能状况&#xff0c;很方便把&#xff01; &#xff0c;原理很简单&#x…

面向对象编程从骨子里就有问题——看看名人大家是如何吐槽面向对象的

2019独角兽企业重金招聘Python工程师标准>>> 本文由“外刊IT评论”网(www.aqee.net)荣誉出品 “面向对象编程是一个极其糟糕的主意&#xff0c;只有硅谷里的人能干出这种事情。” — Edsger Dijkstra(图灵奖获得者) “面向对象设计是用罗马数字做计算。” — Ro…