昨天进行了一下培训,讲解了一下委托跟事件的应用,说实话这个东西听起来还是一头雾水,虽然学会怎么用,但是还没搞明白需要在什么时候用到这个,后来我们经理给我举了个例子,让我做一个经典的委托和事件的例子,就是猫叫人醒老鼠跑。

首先很简单,需要定义猫,人跟老鼠三个类,分别命名为Cat,People,Mouse,在这里我还写了一个接口,里面写了一个void Action(),用以实现多态,People和Mouse两个类继承了这个接口并实现,然后定义一个委托public delegate void Scream(), 返回类型为void,然后在Cat类中定义一个事件public event Scream scream,用来接下里的事件绑定。接下来要写一个虚拟类,来作为一个观察者,而Cat类是作为一个被观察者,当Cat类中的方法被调用以后,触发绑定在事件里面的方法,这里我写了一个虚类来扮演观察者的角色,Cat类做为被观察者,当Cat类被调用呢,观察者告诉另外两个类Cat类已经被调用,然后这两个类各自实现相应的方法,也就是说观察者观察到猫叫了一声以后告诉人和老鼠,人就醒过来,而老鼠就开始跑,这就是同一件事情引发的不同角色的不同动作,而虚类的构造函数方法来绑定虚方法Action()。虚类的代码如下:

public abstract class Observer : IScream
    {
        protected Cat cat{get;set;}
        public Observer(Cat cat)
        {
            this.cat = cat;
            this.cat.scream += Action;
        }
        public abstract void Action();
    }

人跟老鼠的类继承自这个虚类,通过重写虚方法Action来达到实现多态的效果,然后通过base来调用父类的构造函数,人跟老鼠类的代码如下:

class Person:Observer
    {
        public override void Action()
        {
            Console.WriteLine("主人醒来了");
        }
        public Person(Cat cat) : base(cat)
        {
        }
    }

class Mouse : Observer
    {
        public override void Action()
        {
            Console.WriteLine("老鼠跑了");
        }
        public Mouse(Cat cat) : base(cat)
        {
        }
    }

这样定义好了以后,最后只要调用Cat类的方法就能实现预期效果,整体代码如下:

public delegate void Scream();
    public class Cat
    {        
        public event Scream scream;         
        public void Action()
        {
            Console.WriteLine("猫叫了一声");
            scream();
        }        
    }

public abstract class Observer : IScream
    {
        protected Cat cat{get;set;}
        public Observer(Cat cat)
        {
            this.cat = cat;
            this.cat.scream += Action;
        }
        public abstract void Action();
    }

class Mouse : Observer
    {
        public override void Action()
        {
            Console.WriteLine("老鼠跑了");
        }
        public Mouse(Cat cat) : base(cat)
        {
        }
    }

class Person:Observer
    {
        public override void Action()
        {
            Console.WriteLine("主人醒来了");
        }
        public Person(Cat cat) : base(cat)
        {
        }
    }

class Program
    {        
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Person p = new Person(cat);
            Mouse m = new Mouse(cat);
            cat.Action();
            Console.ReadLine();
        }
    }

转载于:https://www.cnblogs.com/TerryLinHao/archive/2011/07/13/2104249.html

猫叫人醒老鼠跑 C#的委托及事件相关推荐

  1. 2011New_C#中的代理与事件_猫叫人醒鼠跑

    (原创:http://hi.baidu.com/grayworm) 代理与事件是DotNet的两个重要概念,但好多朋友感觉没有这两个概念照样能够进行常规的DotNet开发.其实深入理解这两个概念对Do ...

  2. Java猫叫老鼠跑人惊醒_面试题:猫叫、老鼠跑、人醒的一点看法

    这些天一直在面试中,做着不同的面试题,唉,悲催 上周做的一道面试题今天正好出现在园里的首页,看了一下这位同学的实现,基本上方向是对的,就是代码上细节没有注意,有一些错误,这里我就写一下我的理解 --- ...

  3. Java猫叫老鼠跑人惊醒_关于猫叫、老鼠逃跑、人被惊醒的程序设计

    题目是这样的:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒. 要求: 1.要有联动性,老鼠和人的行为是被动的 2.考虑可扩展行,猫叫声可能会引起其他联动效应 看到这个程序设计题目,我的第一反应是用事件 ...

  4. 关于猫叫、老鼠逃跑、人被惊醒的程序设计

    题目是这样的:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒. 要求: 1.要有联动性,老鼠和人的行为是被动的 2.考虑可扩展行,猫叫声可能会引起其他联动效应 看到这个程序设计题目,我的第一反应是用事件 ...

  5. 观察者模式和委托实现 - 老鼠跑,猫叫,人醒

    老鼠跑,猫叫,人醒是典型的事件联动,解决此种情形,可以利用观察者模式或者事件委托来实现.利用设计模式时要考虑耦合,但利用事件委托的话,就不需要了.因为用委托的话,理解比较容易,这里没有单写,而是将委托 ...

  6. 一道事件委托面试题 - 猫叫老鼠跑主人醒

    /* 道事件委托面试题 - 猫叫老鼠跑主人醒 */using System;namespace CatCry {class MainClass{static void Main(string[] ar ...

  7. 【编程题】【Scratch三级】2019.06 猫咪抓老鼠游戏

    猫咪抓老鼠游戏 1. 准备工作 (1)保留小猫角色,添加"Mouse1": (2)默认白色背景. 2. 功能实现 (1)键盘上下左右键控制小猫上下左右移动: (2)老鼠出现在舞台随 ...

  8. 【电子学会】2019年09月图形化三级 -- 猫咪抓老鼠游戏

    猫咪抓老鼠游戏 1. 准备工作 (1)保留小猫角色,添加"Mouse1": (2)默认白色背景. 2. 功能实现 (1)键盘上下左右键控制小猫上下左右移动: (2)老鼠出现在舞台随 ...

  9. (译)C#/.NET中的委托与事件

       C#/.NET中的委托与事件 下载本文的示例源码 目录 译者的话 概述 委托(Delegates) 直接调用方法-不用委托         最基本的委托         调用静态方法       ...

最新文章

  1. SQL删除重复数据方法
  2. Win7 PPTP/L2TP设置详细图解教程
  3. c# 在DataTable的第一列(指定列)的前面添加一列
  4. 如何配置三层交换机创建VLAN 3
  5. 家用电器如何计算功率和消耗的度数
  6. android 自定义actionbar,如何让android的actionbar浮动且透明
  7. docker保存对容器的修改
  8. JavaScript高级程序设计笔记 事件冒泡和事件捕获
  9. 【动态规划笔记】状压dp:蓝桥 矩阵计数 (二进制枚举)
  10. 游戏蛮牛Unity 用户文档
  11. 性能分析之排队论应用
  12. osx86 10.4.3 BF1118 的界面
  13. 三自由度机械臂的三维设计
  14. chrome浏览器恢复书签方法
  15. linux逻辑分区如何创建,linux 创建扩展分区以及逻辑分区
  16. Base64 加解密工具类
  17. Centos6连接网络配置
  18. 为什么要使用dubbo
  19. Object-based superresolution land cover Mapping From Remotely sensed imagery
  20. word表格无法跨页断开,内容被隐藏到了页面下方,如何解决?

热门文章

  1. 开源API网关Kong基本介绍和安装验证
  2. C语言volatile关键字的作用
  3. python装饰器详细剖析
  4. 使用单例模式加载properties文件
  5. python中使用pickle进行序列化
  6. arcgis api for javascript创建webmap
  7. golang bloom filter实现
  8. 解决OutOfMemoryError: unable to create new native thread问题
  9. 用PMML实现机器学习模型的跨平台上线
  10. 程序员面试、算法研究、编程艺术、红黑树、机器学习5大系列集锦