使用事件机制模拟非常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 :EventArgs
30     {
31         public string QuestionArgs { get; set; }
32     }
33     ///
34     /// 主持人类
35     ///
36     public class Host
37     {
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 Guest
59     {
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     /// 嘉宾A
70     ///
71     public class GuestA:Guest
72     {
73         public override void answer(object sender, QuestionArg e)
74         {
75             base.answer(sender, e);
76             Console.WriteLine(this.Gname + "开始答题:我不知道!");
77         }
78     }
79     ///
80     /// 嘉宾B
81     ///
82     public class GuestB : Guest
83     {
84         public override void answer(object sender, QuestionArg e)
85         {
86             base.answer(sender, e);
87             Console.WriteLine(this.Gname + "开始答题:这个有点难!");
88         }
89     }
90 }
时间: 2024-11-16 03:15:08

使用事件机制模拟非常6+1的相关文章

C++中事件机制的简洁实现

事件模型是被广泛使用的好东西,但是C++标准库里没有现成的,其他实现又复杂或者不优雅,比如需要使用宏.现在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先进设施组合出一个轻便的实现吧. 为了达到简洁的目的,需要放弃一些特性: 1.不支持判断函数是否已经绑定过(因为std::function不提供比较方法,自己实现function的话代码又变多了) 2.需要使用者接收返回的回调函数标识来移除事件绑定(原因同上) 3.事件没有返回值,不支持回调函数优先级.条件回调等事件高级特性(比如返回

jQuery 高级事件(模拟操作)

一.模拟操作 在事件触发的时候,有时我们需要一些模拟用户行为的操作.例如:当网页加载完毕后 自行点击一个按钮触发一个事件,而不是用户去点击 //点击按钮事件 $('input').click(function(){ alert('我的第一次点击来自模拟!'); }); //模拟用户点击行为 $('input').trigger('click'); //可以合并两个方法 $('input').click(function(){ alert('我的第一次点击来自模拟!'); }).trigger('

Java事件机制

Java事件由事件类和监听接口组成,自定义一个事件前,必须提供一个事件的监听接口以及一个事件类.JAVA中监听接口是继承java.util.EventListener的类,事件类继承java.util.EventObject的类.很多基本的事件系统已经为我们定义好了,我们只要学会调用即可,但是为了更加灵活地满足特定的需求,我们有时候也需要自定义事件. 对于事件的理解:http://lyunabc.iteye.com/blog/1538940这篇博文讲的不错,有助于我们理解事件从产生到处理这一过程

Javascript事件机制兼容性解决方案

原文:Javascript事件机制兼容性解决方案 本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件: 或者 var input = document.getElementsByTagName('input')[0]; var form = document.getElementsByTagName('form')[0]; Evt.on(input, 'click', function(evt){ console.log('inp

深入研究JavaScript的事件机制

本篇开始将回顾下Javascript的事件机制.同时会从一个最小的函数开始写到最后一个具有完整功能的,强大的事件模块.为叙述方便将响应函数/回调函数/事件Listener/事件handler都称为事件handler.天台县羿壮冶金 先看看页面中添加事件的几种方式: 直接将JS代码写在HTML上 测试:Nowamagic view source print? 1 <div onclick="alert('欢迎访问Nowamagic.net');">Nowamagic</

我也来说说js的事件机制

原文链接:http://www.w3cfuns.com/notes/17398/8062de2558ef495ce6cb7679f940ae5c.html 学js,不懂事件机制,基本可以说学了js,就是白学.本人看了很多js相关书籍,评价一本说讲得好不好,我主要看两块儿,一块儿是js面向对象讲得怎么样,另一块儿就是这个事件机制这块儿.面向对象按下不表,这里就详细说说事件机制.事件这个东西可以说js中核心之一.为啥如此重要,因为js是一门事件驱动的语言. 说说本文的结构.(真的好长,又不想写成一个

【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)--转

前言 javascript事件基础 事件捕获/冒泡 事件对象 事件模拟 移动端响应速度 PC与移动端鼠标事件差异 touch与click响应速度问题 结论 zepto事件机制 注册/注销事件 zepto模拟tap事件 tap事件的问题一览 点透问题 fastclick思想提升点击响应 实现原理 鬼点击 ios与android鼠标事件差异 事件捕获解决鬼点击 结语 前言 这篇博客有点长,如果你是高手请您读一读,能对其中的一些误点提出来,以免我误人子弟,并且帮助我提高 如果你是javascript菜

JavaScript系列----事件机制

1.事件流 1.1.标准事件流 所谓的标准事件流指的的:EMCAScript标准规定事件流包含三个阶段,分别为事件捕获阶段,处于目标阶段,事件冒泡阶段. 下面是一段html代码,根据代码来说明标准事件流. <!DOCTYPE HTML> <html> <body> <div> <button>click</button> </div> </body> </html> 在上面的代码中,如果点击按钮bu

【iScroll源码学习03】iScroll事件机制与滚动条的实现

[iScroll源码学习03]iScroll事件机制与滚动条的实现 前言 想不到又到周末了,周末的时间要抓紧学习才行,前几天我们学习了iScroll几点基础知识: 1. [iScroll源码学习02]分解iScroll三个核心事件点 2. [iScroll源码学习01]准备阶段 3. [iScroll源码学习00]模拟iScroll 今天我们来学习其事件机制以及滚动条的实现,完了后我们iScroll就学习的差不多了,最后会抽离iScroll的精华部分组成一个阉割版iScroll 并总结下iScr