C#,X++事件模型比较

事件是观察者模式的一种实现,事件源定义事件,监听者订阅事件,在事件触发时事件源通知监听者,并执行监听者定义的处理程序,这样事件的发生和处理分离.
C#为了实现事件模型,增加了一个类型delegate(委托),事件源用event关键字定义事件,监听者通过+=,-=来订阅或取消订阅事件,订阅的过程实际上是在事件上增加处理函数的入口地址,这样当事件发生时,事件源就会自动调用这些处理函数.
早在VJ++时代,Anders就在Java上增加了delegate,这激怒了Sun,引发了一场论战,Sun给delegate下了几宗罪,比如,增加了语言的复杂度(因为多了几个关键字),破坏了OO(因为delegate是二等公民,不支持继承),对Java语言本身是有害的.
有兴趣可以Sun的白皮书:
About Microsoft's "Delegates"
MS也不会轻易就速手就擒,下面是MS的反击:
The Truth About Delegates
Java通过内联类(Inner Class)来实现事件模型.
这其实反应了C#之父和Java创始人不同的观念,感觉Anders是实用主义者,而Gosling是完美或者纯粹主义者,C#比Java多了很多特性,比如属性,枚举,委托.这些Gosling都考虑过,但他觉得只要class这个关键字可以实现的都应该用class实现,增加一些关键字会增加语言的复杂度,并且会给程序员的选择带来麻烦.不过做为Anders的Fans,俺当然更喜欢C# style.
好像跑题了......
X++没办法实现C#和Java的事件模型,因为它既没有C#的委托,也没有Java中的内联类.所以它的事件只能依托于运行时调用固定的方法,而这些事件都是Form,Report,DataSource等固定的元素上实现的,可以调用的方法就那么几个,没办法扩充,惟一能做的事情是重载父类的方法,实现自己的逻辑,想在自己定义的类上实现事件是没办法的.不过到目前为止,感觉X++的这些事件对于ERP软件来说也够用了,实在不行调用C#写的Assembly就行了.
原文地址:https://www.cnblogs.com/Farseer1215/p/524813.html