zoukankan      html  css  js  c++  java
  • 关于一个经典的委托和事件的问题 关于老鼠 猫 主人问题 帝都

    具体的实现过程是
    猫叫了一声,把主人吵醒了,老鼠吓跑了
    主人醒后,老鼠被吓进了洞里,猫钻进了了被窝。

    要求:

    1.写三个类,分别表示老鼠,猫,主人
    2.不能在这三个类中出现彼此的类型

    ①首先有一个主人类Master
    class Master
    {
    //声明了一个委托,委托名为MasterWakeUpEventHandler,
    //这个委托所能代表的方法是无参数,无返回值得方法。
    public delegate void MasterWakeUpEventHandler();
    //声明了一个对外公开的public事件MasterWakeUp
    //它的事件类型是委托MasterWakeUpEventHandler
    //表明事件发生时,执行被委托的方法。
    public event MasterWakeUpEventHandler MasterWakeUp;
    private string name;
    public Master(string name)
    {
    this.name = name;
    }
    public void WakeUp()
    {
    Console.WriteLine("我是{0}是谁在叫",name);
    //判断事件是否订阅
    //如果没有订阅MasterWakeUp就为null,也不会引发事件
    if (MasterWakeUp != null)
    {
    MasterWakeUp();
    }
    }
    }
    ②定义一个老鼠Mouse类
    class Mouse
    {
    private string name;
    public Mouse(string name)
    {
    this.name = name;
    }
    public void Run()
    {
    Console.WriteLine("老猫来了,{0}快跑啊。",name);
    }
    public void 躲进洞里()
    {
    Console.WriteLine("主人生气了,{0}的回洞了",name);
    }
    }
    ③定义一个猫Cat类
    class Cat
    {
    //声明了一个委托,委托名为CatShoutEventHandler,
    //这个委托所能代表的方法是无参数,无返回值得方法。
    public delegate void CatShoutEventHandler();
    //声明了一个对外公开的public事件CatShout
    //它的事件类型是委托CatShoutEventHandle
    //表明事件发生时,执行被委托的方法。
    public event CatShoutEventHandler CatShout;
    private string name;
    //构造函数
    public Cat(string name)
    {
    this.name = name;
    }
    //定义了猫的一个Shout方法
    public void Shout()
    {
    Console.WriteLine("喵,我是{0}",name);
    //判断事件是否订阅
    //如果没有订阅CatShout就为null,也不会引发事件
    if (CatShout != null)
    {
    CatShout();
    }
    }
    public void 躲进被窝()
    {
    Console.WriteLine("主人吼了一声,{0}躲进了被窝...",name);
    }
    }
    ④在Program类中
    class Program
    {
    static void Main(string[] args)
    {
    Cat cat = new Cat("猫猫");
    Mouse mouse = new Mouse("鼠鼠");
    Master master = new Master("人人");
    //表示将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。
    //new Cat.CatShoutEventHandler(mouse.Run)的含义是实例化一个委托,而委托的实例其实就是Mouse的Run方法。
    //其中“+=”表示add_CatShout的意思
    cat.CatShout += new Cat.CatShoutEventHandler(mouse.Run);
    cat.CatShout +=new Cat.CatShoutEventHandler(master.WakeUp);
    cat.Shout();
    master .MasterWakeUp+=new Master.MasterWakeUpEventHandler(mouse.躲进洞里);
    master.MasterWakeUp+=new Master.MasterWakeUpEventHandler(cat.躲进被窝);
    master.WakeUp();
    Console.ReadKey();
    } }

  • 相关阅读:
    [最短路径SPFA] POJ 1847 Tram
    [强连通分量] POJ 1236 Network of Schools
    [强连通分量] POJ 2762 Going from u to v or from v to u?
    [强连通分量] POJ 2186 Popular Cows
    [宽度优先搜索] HDU 1372 Knight Moves
    php错误级别和异常处理
    php配置优化
    魔术方法和魔术常量
    事务
    mysql备份和还原
  • 原文地址:https://www.cnblogs.com/OhMonkey/p/3130793.html
Copyright © 2011-2022 走看看