[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.一个喊话人(喊话人有权限),多个拿钥匙开门的人(每个人负责不同的门):米老师大喊给我开一下水麒麟的门——>此时听到消息并且拿着水麒麟钥匙的人就会过来开门
|
.NET
艾伟_转载:把委托说透(2):深入理解委托
在上一篇随笔中我们通过示例逐步引入了委托,并比较了委托和接口。本文将重点剖析委托的实质。 委托在本质上仍然是一个类,我们用delegate关键字声明的所有委托都继承自System.MulticastDelegate。
1108 0
|
C#
艾伟_转载:C#中的委托和事件-抛砖引玉
  最近在学习委托和事件,在书店里面看了好多书,但是都是迷迷的…… 今天在博客园里面看到了 张子阳 所写的博客C#中的委托和事件:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.
1208 0
|
C#
艾伟:C# 中的委托和事件
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。
798 0
|
C#
艾伟_转载:解惑答疑:C#委托和事件
  相信很多人一直为C#委托和事件所困惑,尤其是C#的初学者,学到这一部分会感觉比较困难,很有可能就放弃了,而且.NET对委托和事件封装得挺好,一般都不怎么用到自定义的委托和事件,所以放弃学习该技术就有了借口!   网上也有不少此类的文章,最具代表性的是张子阳的C#中的委托和事件这篇,写得的确很好,...
1388 0
|
C# C++
由猫捉老鼠想起的——关于继承、接口和引用
用C#写了几年的网站,虽然感觉上没什么问题了,但是对于基础知识一直都是模模糊糊的,最近几天重新学习了一下基础知识,感受颇深。对于类、封装、继承、多态、接口等有了新的认识。我想说说我的想法,请大家看看对不对。
843 0
|
JavaScript
用接口实现事件的一种方法,只是玩玩。
  前一阵子,firelong说,应该用接口实现事件,而不应该用委托。我就希望他能给出一个用接口实现事件的方法,我是一直等呀,等到了现在也没有看到。     昨天又看到了,Snake@Net  说不要把接口和委托给混淆了的文章。
716 0