专注

导航

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

首先举一个实例:
创建一个控制台程序,需求是:有一只猫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))的意思。
运行的结果:
8 

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

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

posted on 2011-11-13 12:42  陈啊M  阅读(189)  评论(0编辑  收藏  举报