zoukankan      html  css  js  c++  java
  • C#的委托及事件 猫叫人醒老鼠跑

    原文:http://www.cnblogs.com/TerryLinHao/archive/2011/07/13/2104249.html

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

          首先很简单,需要定义猫,人跟老鼠三个类,分别命名为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();
            }
        }

  • 相关阅读:
    大数据学习相关知识点
    SSMS登记密码清除
    ubuntu 18.04下安装Hadoop
    ubuntu 常见命令整理
    ubuntu 18.04下安装Java
    JQuery ajax请求返回(parsererror)异常处理
    (转载) C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
    编译器的原理
    笔试题积累
    构造函数为什么不能声明为虚函数
  • 原文地址:https://www.cnblogs.com/sealzrt/p/2914717.html
Copyright © 2011-2022 走看看