首页 > 代码库 > 使用事件机制模拟非常6+1
使用事件机制模拟非常6+1
委托和事件,.Net Framework中的应用非常广泛,然而,较好的理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像一道门槛儿,跨过去的,觉得太容易了,而没有过去的人每次见到委托事件就觉得心慌慌,浑身不自在。
我个人还是比较喜欢用面向对象的编程思想去理解逻辑程序,理解编程。下面就用使用事件机制模拟非常6+1的答题过程:
分析:从需求中抽象出Host(主持人)类和Guests(嘉宾类);
作为问题的提问者,Host不知道问题如何回答。因此它只能发布这个事件,将事件委托给多个嘉宾去处理。
因此在Host类定义事件,在Guests类中定义事件的响应方法,通过多播委托的“+=”将相应方法添加到事件列表中,最终Host类将触发这个事件,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 namespace 使用事件模拟非常6_1 6 { 7 class Program 8 { 9 static void Main(string[] args)10 {11 Host host = new Host();12 host.Name = "李咏";13 host.eventArgs.QuestionArgs = "C#的事件如何实现的";14 Guest[] gArray = new Guest[2]{15 new GuestA(){Gname="张三"},16 new GuestB(){Gname="李四"}17 };18 //将嘉宾的答题方法加入委托链19 host.questionEvent += gArray[0].answer;20 host.questionEvent += gArray[1].answer;21 //触发事件22 host.Ask();23 Console.ReadLine();24 }25 }26 ///27 /// 问题参数类28 ///29 public class QuestionArg :EventArgs30 {31 public string QuestionArgs { get; set; }32 }33 ///34 /// 主持人类35 ///36 public class Host37 {38 public Host()39 {40 eventArgs = new QuestionArg();41 }42 //主持人名称43 public string Name { get; set; }44 public QuestionArg eventArgs { get; set; }45 //定义委托与事件46 public delegate void QuestionHandler(object sender, QuestionArg args);47 public event QuestionHandler questionEvent;48 //主持人提问问题的方法49 public void Ask()50 {51 Console.WriteLine("开始答题");52 questionEvent(this, this.eventArgs);53 }54 }55 ///56 /// 嘉宾父类57 ///58 public class Guest59 {60 public string Gname { get; set; }61 //答题方法,虚方法62 public virtual void answer(object sender, QuestionArg e)63 {64 Console.WriteLine("事件的发出者:" + (sender as Host).Name);65 Console.WriteLine("问题是:"+e.QuestionArgs);66 }67 }68 ///69 /// 嘉宾A70 ///71 public class GuestA:Guest72 {73 public override void answer(object sender, QuestionArg e)74 {75 base.answer(sender, e);76 Console.WriteLine(this.Gname + "开始答题:我不知道!");77 }78 }79 ///80 /// 嘉宾B81 ///82 public class GuestB : Guest83 {84 public override void answer(object sender, QuestionArg e)85 {86 base.answer(sender, e);87 Console.WriteLine(this.Gname + "开始答题:这个有点难!");88 }89 }90 }
使用事件机制模拟非常6+1
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。