首页 > 代码库 > 面向对象的思想 泛型和委托
面向对象的思想 泛型和委托
面向对象是一种思想,他的技术体现,可以体现在代码中使用泛型,方法与方法之间的调用不是直接调用,而是使用委托.
使用了泛型,就可以不用考虑数据的类型,从而做到统一的处理.就比如我们以前写代码,每个实体类对应一个DAL,然后每个DAL里面都有增删改查的方法,每个方法都是针对固定的类型来做的.如Update实体A,则一定只能更新实体A.但是使用了泛型就可以Update(<T>),这个T是什么类型,只要你指定什么类型,他就是什么类型,T是实体A,就更新实体A,T是实体B就更新实体B.
只要类型不确定,你可以做很多很多的事.这也是符合我们的面向对象六个原则中的,依赖倒转,要依赖于抽象,而不是依赖于细节.
而委托,则是为了降低方法与方法之间的依赖关系.高内聚低耦合一直是我们追求的.像是大话设计模式上的观察者模式,里面就使用了委托.我分析了一下,他为什么要使用委托.
我开始觉得,为什么这里要用委托,直接调用他们搁置的Close**()的方法不就可以实现各自的功能吗?后来一想
注意一下,代码中的两个人,他们的行为都是被他们的Boss所刺激的,如果boss没有回来,他们是不会关了NBA或者股票的,只有Boss回来,他们接收到消息之后,立马做出响应,关了NBA/股票.所以他们的close方法都委托给了boss的update事件,委托好了事件,在boss的notify的方法中,执行完了update事件就开始执行委托中的方法.
而且是在客户端委托的,就可以做到很灵活的配置.如果有第三个人需要关闭网页,直接将第三个同事的Close网页的方法委托到update事件上,那么老板回来的时候就会有3个人立马Close.而且这两个close方法位于不同的类当中,但是只要把他们方法名放在委托中,只要他们的方法和委托方法的参数和返回值类型都一样就可以,就可以将方法委托到update事件上,一样的处理.
所以如果不在这里使用委托的话,直接调用tongshi1,tongshi2的close方法,那么就是直接关闭NBA或者股票;但是实际情况是老板回来了,他们为了防老板,才关掉的,要不然是不会舍得自己关掉的.
所以如果需要委托,则需要发送消息,被委托方需要能够接收到消息.在委托方发送消息之后,立马相应,完成各种的方法.而这样,委托将方法与方法之间的关系,由我来调用你,变成我有需要,发个消息,你来主动支持我,主动和被动的关系.
下面是我关于委托查的一些资料:
有人说为什么要用委托,因为使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。
可是我感觉这个并不是原因,因为我觉得委托的时候,是需要知道方法的,我觉得他还是知道了调用哪个方法;既然我知道了调用哪个方法,我在客户端直接调用这个方法,我感觉也是可以的.
我不大明白,在客户端调用方法是否可以说是在运行时决定调用哪个方法,但我感觉他是.后来我查了一下,据说在编译时调用,类型是已经确定了的;而在运行时调用,类型是不确定的.那么如果我在客户端直接调用那些方法,按照正常思路,我会new出对象,然后调用他们的方法,我想他们应该类型已经确定了的.而我用委托,需要把方法作为参数放在委托中,我无法理解为什么说委托是在编译时不知道调用哪个方法,不是知道方法了吗?
还有人说:简单点说,只要是程序执行过程中无法预知何时会执行的方法,都必须使用委托。程序不可能知道你什么时候会点击按钮。另外就是在扩展方法的时候也需要委托,假如你定义好了一段过程,有人想要在你的过程中添加一些方法来处理特殊的工作,别人该不会要重写你的过程吧,这时候通过委托让你的过程去执行别人要添加进来的特殊工作。(我不明白他是怎么做到通过委托让你的过程去执行别人要添加进来的特殊工作,怎么加进来的??我感觉你的过程执行完之后,添加进来还有可能,如果不是的话,你要修改你过程中的代码进行添加吗?还是提前就预留好了位置,准备放别人的方法?不明白)
还有人说,委托相当于给方法占个位(告诉程序这个地方将执行某一类方法,相当于一个委托书),并指明这个位置上将执行的方法的格式(返回类型,传入参数类型)
在程序最终执行到该占位的时候,将依据此时绑定到该委托的方法来确定最终真正实现的逻辑。
使用情况:知道传入和传出参数类型,但不确定具体实现逻辑的时候。
C#里面有很多委托,比如List<T>.Sort()方法就有一个重载叫List<T>.Sort(Comparison<T>comparison),这里面的参数 Comparison<T> comparison就是个委托,在具体排序的时候,将根据你传入的具体的方法来执行排序逻辑。
因为这个特性,委托就经常会跟事件联系在一起,因为事件被触发(委托的方法被执行)之后要实现的逻辑,是不能定死的。就像是你触发button的Click事件,但是Click事件之后是要做什么你是不知道的.你这次可以委托画幅画,下次可以弹个窗.
还有这句话:委托,或者说是回调,或者也可以泛指事件通知机制.没错,就是通知,就是回调,我也是这么认为的,嗯.
老实说,我还是没怎么懂委托,还是不大会用,但是总比以前一点都不知道委托是什么要好些.老有人说,用多了,就知道委托的好处了,我多用用吧!