Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  前几天和朋友老邓讨论delegateevent区别的时候,老邓问我对他们的理解,当时自己没理解清楚,只是很简单的一句话:event就是特殊的delegate,也即eventdelegate的子集。并且我对老邓解释只要你愿意,你完全可以将所有的事件用delegate代替。

   后面自己仔细思考了一下,发现自己理解的局限性,确实delegateevent有很多的相似之处,并且delegate完全能实现event的功能。但我并未认证考虑为什么微软要设计这样一个限制了delegate功能的东西出来,也没从观察者角度理解events。相对delegate来说,客户端即观察者只能调用+=或者-+来添加自己对相应事件触发的通知,它不能调用new来实例化发布者的event事件如单击事件,或者直接将发布者的event对象直接赋值null从而撤销发布者所有通知列表,也不能通过调用诸如this.btn.clck(obj,e)之类的方式来触发event发布事件通知。当我们理解了观察者模式并完全站在实际对象角度考虑相信就不难理解为什么event会比delegate多这么多限制了,很显然,第一,观察者不能也不应该有权限实例化事件发布者的消息列表,同理,观察者不应该能控制事件发布者对事件的通知,这些所有的操作应该都是发布者内部的事件而不能交由外部对象来控制,因此,才产生了event对象,它是通过对delegate的限制来封装一部分本来就不应该暴露在外的行为,从而更符合面向对象的思维。我想,在发布者内部的click应该还是一个委托,不过在添加了event关键字之后,.net会通过一系列方法将这个delegate包裹起来从而封装了一部分本来就不应该暴露的行为。这样更符合面向对象的做法。

    因此我认为event在本质上所做的工作应该还是通过delegate来实现的,或者至少原理相同,event关键字只不过是clr给我们对所定义的delegate对象的一个封装,这样对象可以不必暴露本来就不应该被外部对象看到的方法,如果愿意的话,我们完全可以自己去做这些封装的工作。他们最终都是使得我们所定义的对象更加符合封装的原则。
posted on 2009-10-23 15:44  Robin99  阅读(414)  评论(0)    收藏  举报