.net 设计要公开事件的类型

开发人员要经历多个步骤,才能定义好一个公开了一个或多个事件成员的类型。本节详细描述每一个不要的步骤。MailManager 示例应用程序展示了MailManager类型、Fax类型和Pager类型的所有源代码。注意,Pager类型和Fax类型几乎完全相同。

1,第一步:定义类型来容纳所有需要发送给事件通知接收者的附加信息
事件引发时,引发事件的对象可能希望向接收事件通知的对象传递一些附加的信息。这些附加的信息需要封装到它自己的类中,该类通常包含一组私有字段,以及一些用于公共这些字段的只读公共属性。根据约定,这种类应该从System.EventArgs派生,并且雷鸣应该以EventArgs 结束。在本例中,我们将该类命名为NewMailEventArgs类,它的各个字段分别标识了邮件发件人(m_from)、邮件收件人(m_to)以及邮件主题(m_subject).

internal class NewMailEventArgs : EventArgs{
	private readonly String m_from, m_to, m_subject;
	public NewMailEventArgs(String from, String to, String subject){
		m_from = from; m_to =to; m_subject = subject;
		}
	public String From{get{ return m_from;}}
	public String To{get{ return m_to;}}
	public String Subject{get{ return m_subject;}}
}

internal class MailManager{
}

2,第二步:定义事件成员
事件成员使用C#关键字event来定义。每个事件成员都要指定以下内容:一个可访问性标识符;一个委托类型,它支出要调用的方法的原型;以及一个名称。以下是我们的MailManager 类中的事件成员:

internal class MailManager{
	// 第二步定义事件成员
	public event EventHandler<NewMailEventArgs> NewMail;
}

NewMail 是这个事件的名称。事件成员的类型是EventHandler,意味着“事件通知”的所有接收者都必须提供一个原型和EventHandler委托类型匹配的回调方法。由于泛型System.EventHandler 委托类型的定义如下:

public delegate void EnventHanlder<TEventArgs>(Object sender, TEventArgs e) where TEventArgs : EventArgs;

所以方法原型必须具有以下形式:

void MethodName(Object sender, NewMailEventArgs e);

3,定义负责引发事件的方法来通知事件的登记对象

根据约定, 类应定义一个受保护的虚方法。要引发事件时,当前类及其派生类中的代码会调用该方法。该方法要获取一个参数,也就是一个NewMailEventArgs 对象。在这个对象中,包含了传给通知接收对象的信息。该方法的默认实现只检查一下是否有对象登记了对事件的关注。如果有,就引发事件,从而通知事件的登记对象。该方法在MailManager类中看起来像下面这样:

internal class MailManager{
	// 第三步,定义一个负责引发事件的方法,它通知已登记的对象
	// 事件已经发生。如果类是密封的,这个方法要声明为私有和非虚
	protected virtual void OnNewMail(NewMailEventArgs e){
	// 出于线程安全的考虑,现在将对委托字段的引用复制到一个临时字段中
	EventHandler<EventArgs> temp = Interlocked.CompareExchange(ref NewMail, null, null);
	// 任何方法登记了对事件的关注,就通知它们。
	if(temp != null) temp(this, e);
	}
}

4,定义方法将输入转化为期望事件
你的类必须有一个方法获取一些输入,并将它转换为事件的引发。在MailManager的例子中,是调用SimulateNewMail方法来指出一封电子邮件已到达MailManager:

internal class MailManager{
	//定义方法将输入转化为期望事件
	public void SimulateNewMail(String from, String to, String subject){
		//构造一个对象来容纳相传给通知接受者的信息。
		NewMailArgs e = new NewMailEventArgs(from, to, subject);
		// 调用虚方法通知对象事件已发生
		// 如果没有类型重写该方法,我们的对象将通知事件的所有登记对象
		OnNewMail(e);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值