博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 自定义事件整理项目 - EventDemo
阅读量:6457 次
发布时间:2019-06-23

本文共 3331 字,大约阅读时间需要 11 分钟。

模拟主持人发布一个问题,由多个嘉宾来回答这个问题。

 

分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类。

作为问题的发布者,Host不知道问题如何解答。因此它只能发布这个事件,将事件委托给多个嘉宾去处理。因此在Host 类定义事件,在Guests类中定义事件的响应方法。通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件。实现过程如下:

 

代码其实很少下面贴出来所有代码:

 

QuestionArgs.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  public class QuestionArgs:EventArgs      {  public string Message { get; set; }      }  }

 

Program.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  class Program      {  static void Main(string[] args)          {              Host host = new Host();              host.Name = "主持人";              host.args.Message = "C#的事件如何实现的?";              Guests[] gArray = new Guests[3]              {  new GuestA(){Name = "张小三"},  new GuestB(){Name = "李小四"},  new GuestC(){Name = "王老五"}              };  //用+=号,将嘉宾的答题方法加入到委托链              host.QuestionEvent += new QuestionHandler(gArray[0].answer);              host.QuestionEvent += new QuestionHandler(gArray[1].answer);              host.QuestionEvent += new QuestionHandler(gArray[2].answer);  //触发事件              host.StartAnswer();              Console.ReadLine();          }      }  }

 

Host.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  public delegate void QuestionHandler(object sender,QuestionArgs e);  public class Host      {  //定义一个事件          public event QuestionHandler QuestionEvent;  public QuestionArgs args { set; get; }  public Host()          {  //初始化事件参数              args = new QuestionArgs();          }  public string Name { get; set; }  public void StartAnswer()          {              Console.WriteLine("开始答题");              QuestionEvent(this, args);          }      }  }

 

Guests.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  ///   /// 父类  ///      public class Guests      {  ///   /// 嘉宾姓名  ///          public string Name { get; set; }  public virtual void answer(object sender, QuestionArgs e)          {              Console.Write("事件的发出者:" + (sender as Host).Name);              Console.WriteLine("问题是:" + e.Message);          }      }  }

 

GuestC.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  class GuestC:Guests      {  public override void answer(object sender, QuestionArgs e)          {  base.answer(sender, e);              Console.WriteLine("{0}开始答题:我不知道", this.Name);          }      }  }

 

GuestB.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  class GuestB:Guests      {  public override void answer(object sender, QuestionArgs e)          {  base.answer(sender, e);              Console.WriteLine("{0}开始答题:我不知道", this.Name);          }      }  }

 

GuestA.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  namespace EventDemo  {  class GuestA:Guests      {  public override void answer(object sender, QuestionArgs e)          {  base.answer(sender, e);              Console.WriteLine("{0}开始答题:我不知道", this.Name);          }      }  }

 

运行结果:

参考:

转载于:https://www.cnblogs.com/andrew-blog/archive/2011/12/03/CSharp_Event.html

你可能感兴趣的文章
spring 使用redis集群配置
查看>>
jquery-validate 表单验证插件的使用
查看>>
一周试用yii开发一个带各种该有功能的web程序(三)
查看>>
JavaScript的排序算法
查看>>
绑定touch事件后click无效,vue项目解决棒法
查看>>
Python-模块导入-63
查看>>
Asp.net MVC 移除视图引擎(WebFormViewEngine或者RazorViewEngine)
查看>>
用new/delete动态创建数组| 一维/二维/三维
查看>>
视差滚动效果原理解析和效果实现
查看>>
java小应用
查看>>
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
查看>>
MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
查看>>
跳跃表
查看>>
创建hadoop账号
查看>>
优先队列 STL (转)
查看>>
拍卖流程
查看>>
《将博客搬至CSDN》
查看>>
js 设置焦点 判断控件是否获得焦点 判断哪个控件获得焦点
查看>>
python之featVec[:axis]|extend|append
查看>>
NSURL
查看>>