事件数据
接下来我们谈一谈另一个在事件模型中的重要角色,就是在事件发布中被传递的“事件数据”。
一个subscriber在接受同一种事件的时候,可能来自不同的publisher,所以自然地希望知道发出事件的人是谁,也就是在传递的参数当中,必需包含一个publisher 对象的引用。在Java中,推荐所有的事件数据类都继承java.util.EventObject 类。因为在生成一个EventObject 对象的时候,必需给一个event source 对象作为参数。然后可以通过EventObject的getSource()方法来取得这个对象。在EventObject里面,并没有包含其他任何事件数据,所以如果在事件的传递过程当中,有任何事件数据需要传递,就必需从EventObject 派生出一个新的子类出来。如下图:
在.NET当中也有一个相似的类叫System.EventArgs,但是这个类的内容是空的,如下:
public class EventArgs { public static readonly EventArgs Empty; static EventArgs() { Empty = new EventArgs(); } public EventArgs() {} } |
.NET认为不一定所有的subscriber都对event source感兴趣,所以如果需要的话,就把event source当成是delegate方法的参数来传递好了。.NET定义了一个标准的delegate EventHandler,以下是它的签名(signature):
public delegate void EventHandler(object sender, EventArgs e); |
以后,只要你需要的delegate的签名与EventHandler相同的话,就直接用它了。这里所谓的签名相同,是指参数的类型和返回值的类型皆相同。
Java和.NET都希望用户在定义的事件数据类的时候,尽可能的使用推荐的基类,因为这样在publisher对发出的事件数据内容有所变更或扩大的时候,对subscriber的冲击会比较小,这是由于多型(polymorphism)机制的帮助。
结束语 经过这番解析之后,应该能够比较清楚的了解到Java和.NET事件处理框架的设计思路,希望有助于读者更进一步理解其框架的形成过程。从语言的角度来看,.NET的确有一些针对性的改善和试图简化对事件的处理,Java则仍保有其一贯简约的风格。读者若有任何意见和指教,可以通过e-mail与我交流:bruceyou@sina100.com。
查看本文来源