zoukankan      html  css  js  c++  java
  • C#委托——基础2

      在上一篇随笔中,简要说明了怎样定义委托,定义事件,订阅事件,最后也实现了效果,就是当员工类的某个对象,执行某个事件时,委托事件被触发,后面也得到了结果,但是想象一下实际场景中,如果办公室有员工玩游戏了,这个时候,我们要找到是谁,在哪个位置玩游戏,而不是向所有人广播有人玩游戏了,这样并没有什么意义。因此,需要对上篇的代码进行改进,所以就要想办法传递参数,参数中需要包含必要的信息。

      在本例中,关于参数,首先创建了一个参数类, CustomeEvebtArgs 且继承自EventArgs(这个我看的例子人家就是这样说的“是包含事件数据的类的基类”)

     1  public class CustomeEvebtArgs:EventArgs//参数类
     2     {
     3         string name = "";//员工姓名
     4         int number = 0;//所在办公室编号
     5         public CustomeEvebtArgs()
     6         {
     7         }
     8         public string Name
     9         {
    10             get { return this.name; }
    11             set { this.name = value; }
    12         }
    13         public int Number
    14         {
    15             get { return this.number; }
    16             set { this.number = value; }
    17         }
    18     }

    用这个参数类的对象去保存相关信息。而此时此刻,员工类就应当对应有姓名和座位号了,代码同上。

    1      // 定义一个委托(打小报告的狐狸)
    2     /// </summary>
    3     /// <param name="sender">触发事件的源</param>
    4     /// <param name="e">触发时间所携带的参数</param>
    5     public delegate void DelegateClassHandle(object sender,CustomeEvebtArgs e);

    此时,委托事件函数就应当带有定义委托时的上述两个参数了

    PlayGame(this,e) ;

    这个时候 this 代表的是该实例,也就是触发委托事件的实例。e则是该实例中的参数信息,其中e的初始化如下:

     CustomeEvebtArgs e = new CustomeEvebtArgs();
               e.Name = _name;
               e.Number = _number;

    只要定义员工对象初始化后,被初始化的信息就作为参数被传递

     public void Notify(object sender,CustomeEvebtArgs e)
            {
                Console.WriteLine("报告老板,{0}在{1}玩游戏哦",e.Name,((Employee)sender).Number);
            }

    注意:处理事件的函数其函数前面一定要和委托定义时相同,如上所示。而上面的参数也可以用多种方式,既可以用参数类对象的属性表示,也可以用触发事件的实例的属性表示。

    当然事件被触发后,也可以被多个函数处理,比如添加一个“罚工资”的函数

    
    

    static void penalty(object sender, CustomeEvebtArgs e)
    {
    Console.WriteLine("罚款100");
    }

     

    这样只需我的委托函数关联上该函数即可

     e.PlayGame += new DelegateClassHandle(penalty); 这里我没有重新创建一个类,而是直接将该函数作为静态函数,让委托直接调用函数名,而在定义该函数时不要忘了和定义委托时要有同样的参数

  • 相关阅读:
    改变,必须改变
    厦门四日
    再谈兴趣的重要性,人的差别及如何认识自我
    xcode svn checkout的项目无法真机运行解决办法
    [转]c的fopen()打开文件的模式,第二个参数
    cocos2dx 横板游戏触屏人物和背景移动 方法1
    简单的小球移动隐含的bug
    使用CCHttpRequest后要记得release(),否则内存泄漏
    资源路径问题 (ios平台)
    cocos2dx 横板游戏触屏人物和背景移动 方法2
  • 原文地址:https://www.cnblogs.com/80X86/p/5005085.html
Copyright © 2011-2022 走看看