本文没有任何概念介绍,直接通过代码的方式去讲解
首先,我们要知道,什么情况下要用到委托和事件:
请看下面的一个场景:
学校要组织一场辩论会,挑选了两组学生为代表,一面是正方,一面是反方
然后有一名主持人,主持人会组织让哪一方先发言,主持人说结束双方撤离(举个例子,别杠)
而想要说什么,主持人并不关心
那么,有脑子反应快的同学则会说了:
这个直接用if语句不就行了嘛
if(A方代表发言) { A方学生发言 } if(B方代表发言) { B方学生发言 } if(自由辩论) { 双方劈里啪啦在讲 } if(辩论结束) { 双方撤离 }
如果真的有这么简单,那我还写这篇文章干嘛呢?
仔细想想,假如是个课堂,学生可能不止一个,这样的话,每个学生都要写一个IF分支?
在辩论会中,学生无需关心发生的其他事情,只等待主持人的发言信号
主持人让发言,就相当于告诉了全部学生,学生们就会根据自己所在的组,进行发言或做其他事情
开始正题
我们首先要定义三个类(可以是多个,想几个都行),分别为主持人(Host),正方(GroupA),反方(GroupB)
/// <summary> /// 主持人 /// </summary> public class Host { } /// <summary> /// 正方 /// </summary> public class GroupA { } /// <summary> /// 反方 /// </summary> public class GroupB { }
主持人中有 单方发言 自由辩论 撤离三个方法,其中,单方发言有一个形参,就是哪一方(正方,反方),正方和反方各自有一个发言和撤离方法。
/// <summary> /// 主持人 /// </summary> public class Host { /// <summary> /// 发言 /// </summary> /// <param name="group">组A还是组B</param> public void speechDirective(string group) { } /// <summary> /// 自由辩论 /// </summary> public void freeDebateDirective() { } /// <summary> /// 散场 /// </summary> public void overDirective() { } } /// <summary> /// 正方 /// </summary> public class GroupA { /// <summary> /// 发言 /// </summary> public void speech() { } /// <summary> /// 散场 /// </summary> public void over() { } } /// <summary> /// 反方 /// </summary> public class GroupB { /// <summary> /// 发言 /// </summary> public void speech() { } /// <summary> /// 散场 /// </summary> public void over() { } }
到此,三个类已经构造完毕,
那么,怎样让两方根据主持人的指令去发言呢?
我们要在主持人中,采用一种方法,把指令传出去,
在主持人之前,我们要跟别定义一个
带形参的发言委托SpeechEventHanlder
不带形参的自由辩论委托FreeDebateEventHanlder
不带形参的散场委托OverEventHanlder
命名规则就是传递的方法名后+EventHanlder,不要问我为什么,介绍为什么的文章多的是,可以自行去百度或Google
当然,你也可以不遵循命名规则,对程序的运行和编译无任何影响,只是增加了自己或别人日后阅读代码的难度。
delegate void SpeechEventHanlder(string group);//发言委托 delegate void FreeDebateEventHanlder();//自由辩论委托 delegate void OverEventHanlder();//散场委托
然后在主持人中定义两个事件。这个类似于大家在WinForm中拖出Button双击它即可编辑它的事件。
public event SpeechEventHanlder Speech;//发言事件 public event FreeDebateEventHanlder FreeDebate;//自由辩论事件 public event OverEventHanlder Over;//散场事件
事件定义好之后,我们就可以在主持人中调用这个事件了。那么,如果其他学生订阅了这个事件,便可以自动执行了。
/// <summary> /// 发言 /// </summary> /// <param name="group">组A还是组B</param> public void speechDirective(string group) { Console.WriteLine("主持人:请{0}方代表发言",group); //调用发言事件,并传正方还是反方 if (Speech!=null) { Speech(group); } } /// <summary> /// 自由辩论 /// </summary> public void freeDebateDirective() { Console.WriteLine("主持人:请双方自由辩论"); //调用自由辩论事件 if (FreeDebate!=null) { FreeDebate(); } } /// <summary> /// 散场 /// </summary> public void overDirective() { Console.WriteLine("主持人:辩论会就到这里,散会"); //调用散会事件 if (Over!=null) { Over(); } }
同样,不要问我为什么这么写,按照上述操作即可。一旦熟练这种方法,自然就体会其中含义了。
那么,两方学生们必须知道主持人是谁吧,才能听谁的话,因此,在GroupA和GroupB中,都需要声明一个Host,这个声明可以通过GroupA和GroupB的构造函数进行实例化,实例化之后,就可以在GroupA和GroupB中订阅Host中的事件了。
完整代码
class Program { public static void Main(string[] args) { Host host = new Host(); GroupA a = new GroupA(host);//正方 GroupB b = new GroupB(host);//反方 //host.speechDirective("正"); //host.speechDirective("反"); //host.freeDebateDirective(); host.overDirective(); Console.ReadLine(); } } /// <summary> /// 发言委托 /// </summary> /// <param name="group">正/反方</param> public delegate void SpeechEventHanlder(string group); /// <summary> /// 自由辩论委托 /// </summary> public delegate void FreeDebateEventHanlder(); /// <summary> /// 散场委托 /// </summary> public delegate void OverEventHanlder(); /// <summary> /// 主持人 /// </summary> public class Host { public event SpeechEventHanlder Speech;//发言事件 public event FreeDebateEventHanlder FreeDebate;//自由辩论事件 public event OverEventHanlder Over;//散场事件 /// <summary> /// 发言 /// </summary> /// <param name="group">组A还是组B</param> public void speechDirective(string group) { Console.WriteLine("主持人:请{0}方代表发言",group); //调用发言事件,并传正方还是反方 if (Speech!=null) { Speech(group); } } /// <summary> /// 自由辩论 /// </summary> public void freeDebateDirective() { Console.WriteLine("主持人:请双方自由辩论"); //调用自由辩论事件 if (FreeDebate!=null) { FreeDebate(); } } /// <summary> /// 散场 /// </summary> public void overDirective() { Console.WriteLine("主持人:辩论会就到这里,散会"); //调用散会事件 if (Over!=null) { Over(); } } } /// <summary> /// 正方 /// </summary> public class GroupA { Host host; public GroupA(Host host) { this.host = host; //开始绑定事件 host.Speech += new SpeechEventHanlder(a_SpeechEvent); host.FreeDebate += new FreeDebateEventHanlder(a_FreeDebateEvent); host.Over += new OverEventHanlder(a_OverEvent); } /// <summary> /// 主持人发出的发言指令 /// </summary> /// <param name="group">如果主持人说正方,那么正方发表言论</param> void a_SpeechEvent(string group) { if(group.Equals("正")) { speech(); } } /// <summary> /// 主持人发出的自由辩论指令 /// </summary> void a_FreeDebateEvent() { speech(); } /// <summary> /// 主持人发出的散场指令 /// </summary> void a_OverEvent() { over(); } /// <summary> /// 发言 /// </summary> public void speech() { Console.WriteLine("正方选手正在说话·))"); } /// <summary> /// 散场 /// </summary> public void over() { Console.WriteLine("正方选手撤离现场"); } } /// <summary> /// 反方 /// </summary> public class GroupB { Host host; public GroupB(Host host) { this.host = host; host.Speech += new SpeechEventHanlder(a_SpeechEvent); host.FreeDebate += new FreeDebateEventHanlder(a_FreeDebateEvent); host.Over += new OverEventHanlder(a_OverEvent); } /// <summary> /// 主持人发出的发言指令 /// </summary> /// <param name="group">如果主持人说反方,那么反方发表言论</param> void a_SpeechEvent(string group) { if (group.Equals("反")) { speech(); } } /// <summary> /// 主持人发出的自由辩论指令 /// </summary> void a_FreeDebateEvent() { speech(); } /// <summary> /// 主持人发出的散场指令 /// </summary> void a_OverEvent() { over(); } /// <summary> /// 发言 /// </summary> public void speech() { Console.WriteLine("反方选手正在说话·))"); } /// <summary> /// 散场 /// </summary> public void over() { Console.WriteLine("反方选手撤离现场"); } }
写在最后
近期发现某网站采集本网站的内容,并且不加来源,网址和网站名称我就不贴出来了,1是不想招惹仇家,2是不想给他们做外链。还请你们自重,谢谢
微信扫码查看本文
发表评论