不能再继续举例子了,我承认我忽悠您了.这些看上去都可以的实现方法有本质的区别!
首先我们看第一个委托例子:在Calculate时我们的委托被允许使用了该方法内的两个变量a,b从而改变了整个方法的结果.在整个过程中委托时很被动的,因为它不知道自己会在什么时候被触发.上面的例子很简单,使您没有这种感觉,而且前面说过在方法执行的时候当委托被触发我们可以干点别的,比如说做个日志记录什么的,此时接口有能力又不破坏方法本身运行结构,又能做日志记录吗?显然实现了接口的类只能重写一遍该方法.
路人甲:那我在接口的实现中再调用一下原方法,最后在方法的前面或后面加入日志记录功能不就完了吗?
Snake:杀鸡焉用宰牛刀?且不说再原方法的可行性,就算可行了,麻烦不说,万一这个方法执行有多个阶段,每个阶段都要日志记录呢?委托能深入方法,并且由方法控制它安放之地,让委托能起到关键作用,此时作为接口大哥的牛刀也剔不干净鸡骨上的肉哟~.
其次说接口的优点.我们前面可以看到委托能深入方法,也就是说委托的关注群体是方法们,而接口关注的群体则是类们.接口让类必须实现相同签名的方法或属性,以便在程序中通过调用可变的方法.既然是因为类的关系,那么它的方法肯定是不可变的了,每个实现了该接口的类,即便功能差不多也要完完全全写一遍,但是类的地盘大,肚子里的墨水多,虽然在Add类中通过ICal可调用的方法也就一个Calculate(),但是在Calculate始终是Add类的子民,所以该Calculate方法可以调用Add类中所有能调用的资源.而如果是Sub类的话,它的子民Caculate可调用的资源又与Add类不尽相同,毕竟同是Calculate,国籍不同,文化和生活方式也不同嘛,哈哈.
而接口的能力却是委托所不能企及的地方.它只能被方法藏在伸出,方法外一片蓝天而它却无能为力.如果让类比作一个国家,方法比作一个人,那么委托不就是深藏在人大脑内的处理方式的思维吗?不同的人,思维可以变,当乡下人看到城市中的高楼大厦不禁感叹,可乡下人在城市中生活习惯之后,高楼大厦又能怎样,他早已习以为常.
最后的论点有点晦涩,前面的例子具有误导性,所以本篇文章需要读懂个人认为不是很容易,毕竟个人对于表达能力还是比较不自信的.希望各位同仁海涵.
如果各位觉得本文污染了园子的首页,您可以毫不客气的点反对,如果您觉得还不错的话,我建议您可以考虑点击下推荐.
原文标题:写给会混淆委托和接口概念和用途的朋友们
链接:http://www.cnblogs.com/micone/archive/2010/08/02/1790680.html