目录:
介绍委托和事件
声明事件(定义事件)
注册事件
实现事件
触发事件
为事件增加“添加 / 删除”方法
** 一 ** ** 介绍委托和事件 **
事件是特殊化的委托,委托是事件的基础,所以在介绍事件之前先介绍一下委托。
** 委托 ** :使用委托可以将 方法应用( 不是方法 ) 封装在 委托对象 内,然后将 委托对象 传递给调用方法的代码,这样编译的时候代码就没有必要知道调用哪个方法。通过使用委托程序能够在运行时动态的调用不供的方法。
** 事件 ** :事件是对象发送的消息,发送信号通知客户发生了 操作 。这个操作可能是由鼠标单击引起的,也可能是由某些其他的程序逻辑触发的。事件的发送方不需要知道那个对象或者方法接收它引发的事件,发送方只需知道在它和接收方之间存在的中介( Deletgate )
** 二 ** . **** ** 声明事件(定义事件) **
在 GUI 图形界面中的事件(单击按钮或者选择菜单等)是已经定义好的事件,所需要的就是注册事件。我们也可以自己定义声明事件,可以将自己定义的事件应用到程序的任何地方。事件和委托是分不开的, c# 中使用委托来声明事件。
如果在类里面声明事件,那么必须先声明该事件的委托类型,也可以使用一个事先已经声明好的委托类型。
下面是一个声明事件的例子:
using system;
public delegate void MenuHandler()// 事先申明一个委托,也可以在类的内部声明委托类型
public class Menuitem // 声明一个菜单项目的类
{
public event MenuHadler MenuSelection;// 声明一个事件并指定它的委托类型
string text ;// 声明一个字符串
public MenuItem(string text) // 菜单项目类的构造函数
{
this.text=text; // 初始化 text 字符串
}
public void Fird()
{
MenuSelection; // 定义一个触发事件的方法(后面将用到)
}
public string Text // 定义属性
{
get
{
return text;
}
set
{
text=value;
}
}
}
程序首先定义个一个叫做 MenuHandler 的委托,然后定义了叫做 MenuItem 的类, MenuItem 类包含了一个 MenuSelection 事件(菜单被选择事件),事件的委托类型是 MenuHandler 。事件的声明完成啦,下面开始注册事件
三. 注册事件 ** **
这里先讲一下 publisher/subscriber (发布者 / 订阅者)模式,因为事件就是从这个模式继承下来的 。一個訊息的傳送者 (Sender) 稱之為 Publisher ,而該訊息的接收者 (Receiver) ,則稱之為 Subscriber , Subscriber (订阅者)在 Publisher (发布者)处注册自己, Publisher 发生改变的时候,通知 Subscriber 做适当的操作,很类似设计模式中的 Observer 。
在这里我们认为注册的程序就是订阅者( Subscriber )。事件相当于发布者( Publisher ),下面的程序表明了如何把订阅器连接到发布器:
using system;
public class DelegateAndEvents // 定义个注册事件的类
{
public static void int Main ()
{
SiteManager sm=new SiteManager (); // SiteManager 是一个站点管理类
MenuItem AddMenu= new MenuItem(“Add”) // 定义一个新的事件类
MenuItem DelMenu=new MenuItem(“Delete”) // 定义另外一个新的事件类
// 通过委托, sm 类的 Addsite 方法 注册到事件中
AddMenu.MenuSelelction+=new MenuHandler(sm.AddSite)
// 通过委托, sm 类的 DeleteSite 方法 注册到事件中
DelMenu.MenuSelelction+=new MenuHandler(sm. DeleteSite)
}
}
从注册事件的那行代码来看,事件就像是事件类的一个字段(属性),但是对它的访问是很受限制的,只能通过:在该字段上撰写新的委托(+=)或者从字段(可能是复合字段)移除委托(-=)进行访问,
移除注册事件: DelMenu.MenuSelelction - =new MenuHandler(sm. DeleteSite)
** 四.实现事件 **
这里就要讲到上个例子中的 SiteManager 类,它包含了事件需要实现的方法( AddSite,DeleteSite ), SiteManager 类的方法一定要符合事件的委托类型和返回类型,在委托添加到事件前,该方法能够以这个方式付给委托。
using system;
public class SiteManger // 站点管理类
{
public SiteManger() // 构造函数 初始化变量
{
//impelement something
}
public void AddSite() // 方法要符合委托的类型
{
// impelement 执行添加站点的操作代码
}
public void DeleteSite() // 方法要符合委托的类型
{
// impelement 执行删除站点的操作代码
}
}
SiteManger 类的方法要符合委托类型,这样他的方法可以很方便的当作事件的方法使用。
** 五 . ** ** 触发事件 **
当调用事件时就可以说时触发了事件。 事件是从定义它的类中触发的 ** **
示例
using system;
public class menu // 定义一个菜单类
{
public menu(strng title) // 类的构造函数
{
// 初始化变量
}
public void Run() // 触发事件的过程
{
// 声明一个菜单项目对象( menuItem 前面已经定义)
menuItem myMenuItem=new menuItem }
myMenuItem.fire // 调用 fire 方法触发事件,事件执行 SiteManger 类的方法
}
到此为止我就完成了整个事件的实现过程。
** 六.为事件增加“添加 / ** ** 删除”方法 **
如果由大量的方法需要注册到事件时,可以为为事件增加 Add,Remove 方法。通过访问事件的“添加 / 删除方法”来注册方法
示例:
using sytem;
pulic Delete ovid MenuHandler(object sender,EventArgs e); // 示例 1 的变形
public class MenuItem
{
int numberof Events;
string tex;
private MenuHandler mh=null; // 内部得一个委托
public event MenuHandler MenuSelecton
{
add // 增加“添加”方法
{
mh+=value;
nuberofevents++;
}
remove
{
mh-=value;
numberofevents--;
}
}
}