垃圾回收站

July 4, 2007

两个委托事件的例子

[ 分类: .NET, .NET Framework ] 由 弗里曼·潘 发表于 8:17 pm

http://topic.csdn.net/t/20050620/09/4093184.html

哇。眼见在CSDN也玩了一段时间了。想继续学习一下了。最近也有个项目要做了。可能不怎么常来了!在离开前,发个关于对学习委托事件的朋友很有帮助的一两个例子。一个朋友给的,一个是在CSDN搜索到的。感觉非常好!恩,贴上来!  
      两个例子均用现实的例子来解释委托事件的处理过程。很好!  
      第一个例子  
  public   delegate   void   EatEventHandler(object   sender,   EatEventArgs   e);    
  这个的定义也可以不要这样.可以直接就定义一个参数  
  public   delegate   void   EatEventHandler(string   e);   但然用的时候的参数要相对应好哦  
  using   System;    
  namespace   nsEventSample    
  {    
          ///   <summary>    
          ///   类EatEventArgs   必须继承自类EventArgs,用来引发事件时封装数据    
          ///   </summary>    
          public   class   EatEventArgs   :   EventArgs    
          {    
                  public   String   restrauntName;           //饭店名称    
                  public   decimal   moneyOut;                         //准备消费金额    
          }    
          ///   <summary>    
          ///   这个委托用来说明处理吃饭事件的方法的方法头(模式)    
          ///   </summary>    
          public   delegate   void   EatEventHandler(object   sender,   EatEventArgs   e);    
          ///   <summary>    
          ///   引发吃饭事件(EateEvent)的类Master(主人),这个类必须    
          ///   1.声明一个名为EatEvent的事件:   public   event   EatEventHandler   EatEvent;    
          ///   2.通过一个名为OnEatEvent的方法来引发吃饭事件,给那些处理此事件的方法传数据;    
          ///   3.说明在某种情形下引发事件呢?在饿的时候。用方法Hungrg来模拟。    
          ///   </summary>    
          public   class   Master    
          {    
                  //声明事件    
                  public   event   EatEventHandler   EatEvent;    
                  //引发事件的方法    
                  public   void   OnEatEvent(EatEventArgs   e)    
                  {    
                          if   (EatEvent   !=   null)    
                          {    
                                  EatEvent(this,   e);    
                          }    
                  }    
                  //当主人饿的时候,他会指定吃饭地点和消费金额。    
                  public   void   Hungry(String     restrauntName,   decimal   moneyOut)    
                  {    
                          EatEventArgs   e   =   new   EatEventArgs();    
                          e.restrauntName   =   restrauntName;    
                          e.moneyOut   =   moneyOut;    
                          Console.WriteLine(”主人说:”);    
                          Console.WriteLine(”我饿了,要去{0}吃饭,消费{1}元”,   e.restrauntName,   e.moneyOut);    
                          //引发事件    
                          OnEatEvent(e);    
                  }    
          }    
          ///   <summary>    
          ///   类Servant(仆人)有一个方法ArrangeFood(安排食物)来处理主人的吃饭事件    
          ///   </summary>    
          public   class   Servant    
          {    
                  public   void   ArrangeFood(object   sender,   EatEventArgs   e)    
                  {    
                          Console.WriteLine();    
                          Console.WriteLine(”仆人说:”);    
                          Console.WriteLine(”我的主人,   您的命令是   :   “);    
                          Console.WriteLine(”吃饭地点   —   {0}”,   e.restrauntName);    
                          Console.WriteLine(”准备消费   —   {0}元   “,   e.moneyOut);    
                          Console.WriteLine(”好的,正给您安排。。。。。。。。”);    
                          Console.WriteLine(”主人,您的食物在这儿,请慢用”);    
                  }    
          }    
          ///   <summary>    
          ///   类God安排qinshihuang(秦始皇)的仆人是lisi(李斯),并让李斯的ArrangeFood    
          ///   方法来处理qinshihuang的吃饭事件:qinshihuang.EatEvent   +=   new   EatEventHandler(lishi.ArrangeFood);    
          ///   </summary>    
          public   class   God    
          {    
                  public   static   void   Main()    
                  {    
                          Master     qinshihuang   =   new   Master();    
                          Servant   lishi   =   new   Servant();    
                          qinshihuang.EatEvent   +=   new   EatEventHandler(lishi.ArrangeFood);    
                          //秦始皇饿了,想去希尔顿大酒店,消费5000元    
                          qinshihuang.Hungry(”希尔顿大酒店”,   5000.0m);    
                  }    
          }    
  }    
  第二个例子来源于:  
  http://community.csdn.net/Expert/topic/2651/2651579.xml?temp=.7183191  
  比如说一个公司(场景),你是老板,手下有两个员工,小张和小李。你命令小张注意小李,在开发软件工作的时候如果上网打游戏,你就记录下来,从小李工资里扣100元钱。这个实际上就是现实中的委托。  
  现在给出一个代码,C#控制台程序,编译运行通过  
  using   System;  
  namespace   CSharpConsole  
  {  
    public   class   场景  
    {  
      [STAThread]  
      public   static   void   Main(string[]   args)  
      {  
        Console.WriteLine(”场景开始了….”);  
        //   生成小王  
        小王   w   =   new   小王();  
        //   生成小账  
        小张   z   =   new   小张();  
        //   指定监视  
        z.PlayGame   +=   new   PlayGameHandler(w.扣钱);  
        //   开始玩游戏  
        z.玩游戏();  
        Console.WriteLine(”场景结束…”);  
        Console.ReadLine();  
      }  
    }  
    //   负责扣钱的人  
    public   class   小王  
    {  
      public   小王()  
      {  
        Console.WriteLine(”生成小王…”);  
      }  
      public   void   扣钱(object   sender,EventArgs   e)  
      {  
        Console.WriteLine(”小王:好小子,上班时间胆敢玩游戏…”);  
        Console.WriteLine(”小王:看看你小子有多少钱…”);  
        小张   f   =   (小张)sender;  
        Console.WriteLine(”小张的钱:   ”   +   f.钱.ToString());  
        Console.WriteLine(”开始扣钱……”);  
        System.Threading.Thread.Sleep(500);  
        f.钱   =   f.钱   -   500;  
        Console.WriteLine(”扣完了….现在小张还剩下:”   +   f.钱.ToString());  
      }  
    }  
    //   如果玩游戏,则引发事件  
    public   class   小张  
    {  
      //   先定义一个事件,这个事件表示“小张”在玩游戏。  
      public   event   PlayGameHandler   PlayGame;  
      //   保存小张钱的变量  
      private   int   m_Money;  
      public   小张()  
      {  
        Console.WriteLine(”生成小张….”);  
        m_Money   =   1000;   //   构造函数,初始化小张的钱。  
      }  
      public   int   钱   //   此属性可以操作小张的钱。  
      {  
        get  
        {  
          return   m_Money;  
        }  
        set  
        {  
          m_Money   =   value;  
        }  
      }  
      public   void   玩游戏()  
      {  
        Console.WriteLine(”小张开始玩游戏了…..”);  
        Console.WriteLine(”小张:CS好玩,哈哈哈!   我玩…..”);  
        System.Threading.Thread.Sleep(500);  
        System.EventArgs   e   =   new   EventArgs();  
        OnPlayGame(e);  
      }  
      protected   virtual   void   OnPlayGame(EventArgs   e)  
      {  
        if(PlayGame   !=   null)  
        {  
          PlayGame(this,e);  
        }  
      }  
    }  
    //   定义委托处理程序  
    public   delegate   void   PlayGameHandler(object   sender,System.EventArgs   e);  
  }  
  如果对大家有帮助大家就顶一个,如果觉得对您来说这太菜了。那说明是我太菜了。呵呵。因为我本来就很菜。想再学学。。恩。。N天后结帖。。

.NET 事件模型教程(封面)

很久没发文章了,今天发一篇写了半个多月的教程,限于篇幅无法发布到首页来,目录如下:

.NET 事件模型教程(一) 作者破宝@博客园

.NET 事件模型教程(二)

.NET 事件模型教程(三)

事件、事件处理程序概念

在面向对象理论中,一个对象(类的实例)可以有属性(property,获取或设置对象的状态)、方法(method,对象可以做的动作)等成员外,还有事件event)。所谓事件,是对象内部状态发生了某些变化、或者对象做某些动作时(或做之前、做之后),向外界发出的通知。打个比方就是,对象“张三”肚子疼了,然后他站在空地上大叫一声“我肚子疼了!”事件就是这个通知。

那么,相对于对象内部发出的事件通知,外部环境可能需要应对某些事件的发生,而做出相应的反应。接着上面的比方,张三大叫一声之后,救护车来了把它接到医院(或者疯人院,呵呵,开个玩笑)。外界因应事件发生而做出的反应(具体到程序上,就是针对该事件而写的那些处理代码),称为事件处理程序event handler)。

事件处理程序必须和对象的事件挂钩后,才可能会被执行。否则,孤立的事件处理程序不会被执行。另一方面,对象发生事件时,并不一定要有相应的处理程序。就如张三大叫之后,外界环境没有做出任何反应。也就是说,对象的事件和外界对该对象的事件处理之间,并没有必然的联系,需要你去挂接。

在开始学习之前,我希望大家首先区分“事件”和“事件处理程序”这两个概念。事件是隶属于对象(类)本身的,事件处理程序是外界代码针对对象的事件做出的反应。事件,是对象(类)的设计者、开发者应该完成的;事件处理程序是外界调用方需要完成的。简单的说,事件是“内”;事件处理程序是“外”。

了解以上基本概念之后,我们开始学习具体的代码实现过程。因为涉及代码比较多,限于篇幅,我只是将代码中比较重要的部分贴在文章里,进行解析,剩余代码还是请读者自己查阅,我已经把源代码打了包提供下载。我也建议你对照这些源代码,来学习教程。[下载本教程的源代码]


0 条评论 »

还没有人对这篇文章发表评论,赶紧留一个吧。

RSS feed for comments on this post. TrackBack URI

相关文章:
  • 暂时没有相关的文章
  • 发表评论