zoukankan      html  css  js  c++  java
  • 从发布者和订阅者来看事件

    一个事件代码,只需要记住5个部分即可,如图所示:

    1.声明委托:事件和事件处理程序必须有共同的签名和返回类型,它们通过委托类型进行描述。

    2.声明事件:发布者类必须声明一个订阅者类可以注册的事件成员。

    3.触发事件:发布者类中触发事件,便会调用注册在事件上的所有事件处理程序。

    4.注册事件:订阅者必须订阅事件才能在事件被触发时得到通知。

    5.处理事件:订阅者会在事件发生后执行相应的处理程序。

    一、猫和老鼠的例子(不传递数据)

    代码如下:

    using System;
    namespace 练习专用
    {
    //声明委托
    public delegate void MyDel();

    //发布者类-猫
    class Cat
    {
    //声明事件
    public event MyDel CatCryEvent;
    //在猫叫的方法中触发事件
    public void Cry()
    {
    Console.WriteLine("有只猫在叫。。。");
    //触发事件
    CatCryEvent();
    }
    }

    //订阅者类-老鼠
    class Mouse
    {
    public Mouse(Cat cat)
    {
    //注册事件,订阅者老鼠向事件添加事件处理程序
    cat.CatCryEvent += Run;
    }
    //处理事件,事件发生后的处理程序
    void Run()
    {
    Console.WriteLine("老鼠快跑吧!!!");
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Cat cat1 = new Cat();
    Mouse mouse1 = new Mouse(cat1);
    cat1.Cry();
    }
    }
    }

    二、猫和老鼠的例子(传递数据)

    可以使用System命名空间提供的EventHandler委托类型,所以不需要自己定义委托类型了,它是这么定义的:

    public delegate void EventHandler(object sender, EventArgs e);
    //第一个参数用来保存触发事件的对象的引用。由于是object类,所以可以匹配任何类型的实例
    //第二个参数用来保存状态信息,指明什么类型适用于该应用程序
    为了向事件处理程序的第二个参数传入数据,需要声明一个派生自EventArgs的自定义类来保存需要传入的数据。
    代码如下:

    using System;
    namespace 练习专用
    {
    //自定义一个派生自EventArgs的类,保存数据
    class CryEventArgs : EventArgs
    {
    //存储一个字符串
    public string CatName
    {
    get;
    set;
    }
    }

    //发布者类-猫
    class Cat
    {
    public string CatName
    {
    get;
    set;
    }
    //构造函数,给猫弄个名字
    public Cat(string name)
    {
    this.CatName = name;
    }
    //声明事件,使用自定义类的泛型委托
    public static event EventHandler<CryEventArgs> CatCryEvent;
    //在猫叫的方法中触发事件
    public void Cry()
    {
    Console.WriteLine("有只猫在叫。。。");
    //把猫的名字保存到刚才的自定义类中
    CryEventArgs e = new CryEventArgs();
    e.CatName = this.CatName;
    //触发事件,传递参数
    CatCryEvent(this, e);
    }
    }

    //订阅者类-老鼠
    class Mouse
    {
    public Mouse()
    {
    //注册事件,订阅者老鼠向事件添加事件处理程序
    Cat.CatCryEvent += Run;
    }
    //处理事件,事件发生后的处理程序
    void Run(object sender, CryEventArgs e)
    {
    if (e.CatName == "黑猫警长")
    {
    Console.WriteLine("是黑猫警长,老鼠快特么的跑吧!!!");
    }
    else
    {
    Console.WriteLine("不是黑猫警长,是{0},老鼠不用跑了。。。", e.CatName);
    }
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Cat cat1 = new Cat("黑猫警长");
    Cat cat2 = new Cat("小猫咪");
    Mouse mouse = new Mouse();
    cat1.Cry();
    Console.WriteLine("===============手动分割线===============");
    cat2.Cry();
    }
    }
    }

    ---------------------
    作者:CRonaldo9399
    来源:CSDN
    原文:https://blog.csdn.net/sinat_32832727/article/details/54800920
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    C++ MessageBox()
    magento 获取attribute的所有option
    在mangento后台调用wysiwyg编辑器
    正则式匹配数字字符串中的数字
    use magento default datepicker plugin in your project
    Colorbox cannot load the image added by js
    deal with 'non-admin area' warn
    How to use pagination in Magento
    Magento
    Magento布局layout.xml文件详解
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9985539.html
Copyright © 2011-2022 走看看