在上一篇看到他我一下子就悟了(续)---委托,被人狂喷。说写的太空,没有什么内容之类的。所以准备在这里重写下,不过还是按着以前的方式尽量简单的写。这里我们以打篮球为例。

第一步:首先,其他对象订购事件

当发球的球员产生它的发球事件之前,其他球员需要订购这个事件,采用这种方式,只要出现一个发球事件,其他球

员就能够知道。

第二步:触发事件

当球被发出时,此时发球员对象产生一个新事件。

第三步:球产生一个事件

创建一个新事件,这个事件还有一些参数,如球的距离和轨迹。这些参数作为EventArgs对象的一个实例关联到事件,然后

事件发出,所有监听对象都能得到这个事件。一旦事件产生,所有订购者都会得到通知,并做一些处理。

第四步:订购者得到通知

由于其他球员对象都订购了发球球员对象的发球事件,所以这些对象会得到通知,并先后调用他们的事件处理方法。事件处

理程序就是产生事件时订购者对象运行的方法,一旦发球者产生了其事件,就会创建一个BallEventArgs对象,其中包含球的轨迹

和距离,从而将个对象传递到订购者的事件处理程序。

第五步:各个对象处理事件

现在,其他球员都会以他们自己的方式处理发球事件。不过并不是同时运行---他们的事件处理程序会先后得到调用,并以

BallEventArgs对象的一个引用作为参数。

下面我们分析下把各个部分连接起来

1.我们需要一个标示事件参数的对象

要记住,Play事件(我们下面把发球事件都说成play事件)有一些需要携带的参数。所以我们需要一个简单的对象来表示这些参数。

为此,.NET 提供了一个标准的类,名为EventArgs,不过这个类没有任何成员。它的目的只有一个,就是允许将你的事件的参数对象传

递到事件事件处理程序加以使用。 以下是事件参数类的声明:

public class BallEventArgs:EventArgs

2.接下来需要在产生事件的类中定义这个事件

我们在SendPlayer类中(就是发球球员类,汗,英文不是太好,见谅)定义一个事件,以便其他对象订购这个事件。
声明如下:

public event EventHandler Play;

event关键字后面的EventHandler不是C#的保留字,它是.NET提供的。之所以需要它,是为了告诉订购事件的对象。

他们的事件处理方法应该是什么样子(有怎样的签名)

即他们的事件处理程序应当有两个参数,一个参数是名为sender的object,另一个参数是名为e的EventArgs引用。

3.订购类需要事件处理方法

订购SendPlayer的Play事件的各个对象都需要一个事件处理程序。其实我们早就知道事件处理程序是如何工作的,

你拉一个Button,然后双击它,IDE就自动给你增加一个click事件。所以Play的事件你看起来应该很熟悉。

          

             void  sendPlayer_Play(object sender,EventArgs e)

C#中并没有规则要求事件处理程序必须按某种方式命名,不过这是一种非常标准的命名约定:首先是对象引用名,

后面一个下划线,再后面是事件名。

4.各个对象订购事件

一旦建立了事件处理程序,其他球员对象需要关联他们自己的事件处理程序。每个对象都有自己特定的

sendPlayer_Play方法,对这个事件做出不同的响应。所以,

如果有一个SendPlayer对象引用变量或字段,名为sendPlayer,可以用+=操作符关联事件处理程序:

sendPlayer.Play+=new EventHandler(sendPlayer_Play);

5.SendPlayer对象产生一个事件通知订购者球赛开始。

既然已经创建事件,那么触发这个事件就很容易,只需要调用Play事件。

if(Play!=null)

Play(this,e);

基本的步骤都有了,大家可以按照步骤写自己的事件了。

最新文章

  1. H5文件操作api--持续完善中
  2. Permission is only granted to system apps
  3. Redis缓存数据库详解
  4. POJ 3686 & 拆点&KM
  5. php session 跨页失效问题
  6. js实现文字字幕滚动
  7. (剑指Offer)面试题24:二叉搜索树的后序遍历序列
  8. HDU 3664 Permutation Counting (DP)
  9. S.O.L.I.D
  10. TEXT文本编辑框4 点击按钮读取文本框内容到内表
  11. 解压tar.gz文件报错gzip: stdin: not in gzip format解决方法
  12. java流程控制语句总结
  13. canvas-4createPattern.html
  14. loadrunner报错
  15. PHP 重置数组为连续数字索引的几种方式
  16. u3d中 rect[2] == rt->GetGLWidth() && rect[3] == rt->GetGLHeight()错误的原因及解决方法
  17. sql,将一天所有记录按小时划分
  18. Linux快速定位并且杀掉占用端口的进程
  19. asp.net后台cs中的JSON格式变量在前台Js中调用方法(前后台示例代码)
  20. POJ 1160 Post Office(DP+经典预处理)

热门文章

  1. linux下git远程仓库的搭建
  2. Hive Bug修复:ORC表中array数据类型长度超过1024报异常
  3. 【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
  4. 多用户在线人数监听(基于TomCat)
  5. 网页关闭(解决window.close在火狐下不兼容问题)
  6. day 71 crm(8) 权限组件的设置,以及权限组件的应用
  7. the fist blood of java-eclipse 哈哈哈哈 封装的运用
  8. python高并发?
  9. odoo开发笔记 -- 后台代码什么时候需要注意编码格式
  10. Centos 7 开启BBR