tnblog
首页
登录

谈谈对事件和委托的理解

411人阅读 2019/1/4 15:06 评论:0 手机 收藏 关注
分类: .net

对于c#的程序员来说,事件和委托可能是一道坎,过去的人觉得很简单,没过去的人觉得这个堵得慌 ,每次用着都很难受。本人就是那个用着很难受的那个,做为一个百折不挠的程序员 我借鉴了网上一位前辈的代码,加上自己的理解来谈谈事件和委托。、、

 

先介绍一个场景,用历史的鸿门宴来说吧, 首领A要请敌人吃饭,同时队伍B,队伍C埋伏在两边,若首领 A 举左手,则B队杀出 攻击敌人

若首领A举右手 则C队杀出 攻击敌人。 若摔杯  则B,C同时杀出。

看到这个场景,我之前都会想,这个很简单啊 

if(首领A举左手)

  队伍B攻击

 else if(首领B举右手)

   队伍C攻击

 else

  队伍B,C同时攻击

但是问题来了, 我不知道首领何时举杯,也不可能一直循环等待首领举杯,还有如果首领觉得队伍不够,还要添加队伍D,队伍E。。。以及更多的队伍呢?  那么程序的可扩展性就不好了,这个时候事件就能完美的解决这些问题。


首先  我们来定义首领A

    public class A

    { 

        //定义举手动作

        public void Raise(string Hand)

        {

            Console.WriteLine("首领举了{0}手",Hand);

             

        }

   //定义摔杯动作

        public void Fall()

        {

            Console.WriteLine("首领摔杯了");

        }

    }


接着  我们来定义队伍B


   public class B

    {

        //攻击

        public void Attack()

        {

            Console.WriteLine("部下B发起了攻击");

        }


    }

 

定义队伍C


   public class C

    {

        //攻击

        public void Attack()

        {

            Console.WriteLine("部下C发起了攻击");

        }

    }


到这里  首领A,队伍B,队伍C 他们各自的动作就已经定义好了 ,队伍B和队伍C现在只需要等待首领A发出信号,然后一举全歼敌人

这个时候 事件的作用就体现出来了 

首先 首领A可以定义两个事件,举杯事件和摔杯事件,

     //首领举杯事件

        public event  Action<string> RaiseEvent;

        //首领摔杯事件

        public event Action FallEvent;

而队伍B和队伍C只需要各自订阅首领A的事件,就可以根据首领A发出的动作做出相应的攻击

 

具体代码如下:


首先是首领A:

    public class A

    {

        //首领举杯事件

        public event  Action<string>  ;

        //首领摔杯事件

        public event Action FallEvent;

        //定义举手动作

        public void Raise(string Hand)

        {

            Console.WriteLine("首领举了{0}手",Hand);

            if (RaiseEvent != null)           

                RaiseEvent(Hand);           

        }

        public void Fall()

        {

            Console.WriteLine("首领摔杯了");

            if (FallEvent != null)

                FallEvent();

        }

    }

接着是队伍B的

  public class B

    {

        A a;

        public B(A a)

        {

            this.a = a;

            a.RaiseEvent +=new Action<string>(a_RaiseEvent);

            a.FallEvent += new Action(a_FallEvent);

        }


        //首领举左手

        public void a_RaiseEvent(string Hand)

        {

            if (Hand == "左")

                Attack();

        }

        //首领摔杯

        public void a_FallEvent()

        {

            Attack();

        }

        //攻击

        public void Attack()

        {

            Console.WriteLine("部下B发起了攻击");

        }


    }

最后是队伍C的

  public class C

    {

        A a;


        public C(A a)

        {

            this.a = a;

            a.RaiseEvent += new Action<string>(c_RaiseEvent);

            a.FallEvent += new Action(c_FallEvent);

        }


        //首领举右手

        public void c_RaiseEvent(string Hand)

        {

            if (Hand == "右")

                Attack(); 

        }

        //首领摔杯

        public void c_FallEvent()

        {

            Attack();

        }

        public void Attack()

        {

            Console.WriteLine("部下C发起了攻击");

        }

    }

最后对程序的调用

   static void Main(string[] args)

        {

            A a = new A();

            B b = new B(a);

            C c = new C(a);

            a.Raise("左");

           a.Raise("右");

            a.Fall();

            Console.ReadLine();

        }

事件总体来说是一中特殊的委托,在这个场景中,首领A定义事件,队伍B,队伍C把订阅事件,最后达到根据首领A的动作队伍B,C做出相应的动作。


评价
我不快乐啊
文章
6
评论
8
分类
16
粉丝
16
{{item.ArticleTitle}}
{{item.BlogName}} : {{item.Content}}