======================================================
注:本文源代码点此下载
======================================================
说的直白点,lz对于所讨论的这些东西,基本都处于一知半解的程度。
接口可以完整模拟委托,怎么会不可能做到呢?只是没人做而已,因为语言的设计哲学不同,java毫无必要去整个委托出来。就像javascript也毫无必要自己搞个委托对象出来一样,函数本身就是对象又何必要个调用代理?
至于事件,事件的定义简单到以至于没有人去讨论,事件就是thing that happens,也就是发生的事情。
所以我们讨论的从来都是“事件机制”,“事件模型”,也就是怎么实现事件,或者更具体一点,怎么在model/object之间传递消息。
c#的事件模型就是通过muticastdelegate来实现多播,javascript在运行时根本就不存在多播委托(甚至说根本就不存在委托),可以自己模拟实现。但这就有不同,比如说你能够简单的element.onclick += function(){ ... };来附加一个处理函数么?
当然在javascript实现多播的方法非常多,你可以创建粘合函数例如var multicast = function(){ a(); b(); };也可以采用其他任何你喜欢的办法。
好,我现在问?c#就不可以用emit来创建粘合函数了么?当然可以!
那么我们讨论的是什么呢?是javascript的事件机制和c#的都长得象鸭子?
更何况,事件一定要多播么?可以轮询不?可以广播不?当然都可以。
所谓对事件的理解,基本上就是照着c#的实现念的么。
拿编程语言来说,我们说语言一定有限制,例如java没有委托,不能运算符重载,这就是限制。为了陈述方便,我定义语言可以实现的效果叫做能力,那java没有委托就丧失了动态绑定调用函数的能力了么?不会。。。
lz在对事件的定义中,特别提到不必改变响应行为方自身的实现,恐怕就是针对java的吧?java用观察者模式自然是要求响应方(监听方)要实现监听接口,但这个监听方就不能是一个实际响应方的代理或者说包装?换言之我写一个类监听事件,这个类必须有所约束(譬如说实现某个接口)那我这个类就一定要响应这个事件么?我就不能把这个事件转发给另一个不需要有任何约束的响应类么?这样实际的响应类岂不就不必改变响应行为方自身的实现了?
java没有丧失动态绑定调用函数的能力,所以java也有能力完整的实现c#的事件模型,javascript也可以。
再来看看我们怎么定义c#的事件模型。
如果我们要去定义一个c#的事件模型:我们可以具体到:“使用+=运算符连接某个方法的成员表达式和某个事件的成员表达式”。也可以抽象成:“利用多播函数调用代理实现消息广播”。显然具体的定义毫无意义。
而如果再抽象成:“对象之间传递消息”,或是定义为“一个表达式调用一堆方法”。显然就不是c#的事件模型了。
多播委托本来就是.net事件模型的特点。。。。.net也可以用别的方式来实现事件模型,但我们一说到.net的事件模型就会想到muticastdelegate。一说java的事件模型会想到listener。一说javascript的事件模型会想到什么呢?
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/