在上一篇看到他我一下子就悟了(续)---委托,被人狂喷。说写的太空,没有什么内容之类的。所以准备在这里重写下,不过还是按着以前的方式尽量简单的写。这里我们以打篮球为例。
第一步:首先,其他对象订购事件
当发球的球员产生它的发球事件之前,其他球员需要订购这个事件,采用这种方式,只要出现一个发球事件,其他球
员就能够知道。
第二步:触发事件
当球被发出时,此时发球员对象产生一个新事件。
第三步:球产生一个事件
创建一个新事件,这个事件还有一些参数,如球的距离和轨迹。这些参数作为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);
基本的步骤都有了,大家可以按照步骤写自己的事件了。