模拟主持人发布一个问题,由多个嘉宾来回答这个问题。
分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类。
作为问题的发布者,Host不知道问题如何解答。因此它只能发布这个事件,将事件委托给多个嘉宾去处理。因此在Host 类定义事件,在Guests类中定义事件的响应方法。通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件。实现过程如下:
代码其实很少下面贴出来所有代码:
QuestionArgs.cs
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- publicclassQuestionArgs:EventArgs
- {
- publicstringMessage{get;set;}
- }
- }
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- classProgram
- {
- staticvoidMain(string[]args)
- {
- Hosthost=newHost();
- host.Name="主持人";
- host.args.Message="C#的事件如何实现的?";
- Guests[]gArray=newGuests[3]
- {
- newGuestA(){Name="张小三"},
- newGuestB(){Name="李小四"},
- newGuestC(){Name="王老五"}
- };
- //用+=号,将嘉宾的答题方法加入到委托链
- host.QuestionEvent+=newQuestionHandler(gArray[0].answer);
- host.QuestionEvent+=newQuestionHandler(gArray[1].answer);
- host.QuestionEvent+=newQuestionHandler(gArray[2].answer);
- //触发事件
- host.StartAnswer();
- Console.ReadLine();
- }
- }
- }<spanstyle="color:#ff0000;">
- </span>
Host.cs
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- publicdelegatevoidQuestionHandler(objectsender,QuestionArgse);
- publicclassHost
- {
- //定义一个事件
- publiceventQuestionHandlerQuestionEvent;
- publicQuestionArgsargs{set;get;}
- publicHost()
- {
- //初始化事件参数
- args=newQuestionArgs();
- }
- publicstringName{get;set;}
- publicvoidStartAnswer()
- {
- Console.WriteLine("开始答题");
- QuestionEvent(this,args);
- }
- }
- }
Guests.cs
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- ///<summary>
- ///父类
- ///</summary>
- publicclassGuests
- {
- ///<summary>
- ///嘉宾姓名
- ///</summary>
- publicstringName{get;set;}
- publicvirtualvoidanswer(objectsender,QuestionArgse)
- {
- Console.Write("事件的发出者:"+(senderasHost).Name);
- Console.WriteLine("问题是:"+e.Message);
- }
- }
- }
GuestC.cs
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- classGuestC:Guests
- {
- publicoverridevoidanswer(objectsender,QuestionArgse)
- {
- base.answer(sender,e);
- Console.WriteLine("{0}开始答题:我不知道",this.Name);
- }
- }
- }
GuestB.cs
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- classGuestB:Guests
- {
- publicoverridevoidanswer(objectsender,QuestionArgse)
- {
- base.answer(sender,e);
- Console.WriteLine("{0}开始答题:我不知道",this.Name);
- }
- }
- }
GuestA.cs
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceEventDemo
- {
- classGuestA:Guests
- {
- publicoverridevoidanswer(objectsender,QuestionArgse)
- {
- base.answer(sender,e);
- Console.WriteLine("{0}开始答题:我不知道",this.Name);
- }
- }
- }
运行结果:
