[C#]猫叫人醒老鼠跑 C#的委托及事件

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

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

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

相关文章
开门小例子学习观察者模式&事件与委托
3.2.一个喊话人(喊话人有权限),多个拿钥匙开门的人(每个人负责不同的门):米老师大喊给我开一下水麒麟的门——>此时听到消息并且拿着水麒麟钥匙的人就会过来开门
|
自然语言处理 C# C++
【C#】【平时作业】习题-10-委托
【C#】【平时作业】习题-10-委托
133 0
|
XML 安全 Java
超车时刻:Java反射源码解析
超车时刻:Java反射源码解析
169 0
超车时刻:Java反射源码解析
|
存储 安全 Java
static关键字真能提高Bean的优先级吗?答:真能(下)
static关键字真能提高Bean的优先级吗?答:真能(下)
static关键字真能提高Bean的优先级吗?答:真能(下)
|
Java 中间件 程序员
static关键字真能提高Bean的优先级吗?答:真能(上)
static关键字真能提高Bean的优先级吗?答:真能(上)
static关键字真能提高Bean的优先级吗?答:真能(上)
|
监控 Java 数据库
一个线程罢工的诡异事件
线上某个应用里业务逻辑没有执行,导致的结果是数据库里的某些数据没有更新。
|
安全 Shell Linux
让类/进程/脚本「单身」的方法
有某些场景下,我们不希望有多个相同的 Linux 进程 或 Shell 脚本同时执行,因为相同进程同时执行,可能会破坏数据的一致性。 当然还有在 C++ 代码里,有时希望保证程序中一个类只有一个实例,并提供一个访问它的全局访问点,也就是所谓的「单例模式」。只有一个实例很重要,比如一个打印机可以有多个打印任务,但是只有一个正在工作的任务,一个系统只能有一个窗口管理器或文件系统。 
让类/进程/脚本「单身」的方法
|
编译器 C# C++
我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】
我竟然用它搞懂了王者荣耀的技能释放机制!【C#委托】
274 0
|
Java Spring
static关键字真能提高Bean的优先级吗?答:真能(中)
static关键字真能提高Bean的优先级吗?答:真能(中)