面向对象的思想 泛型和托付

        面向对象是一种思想,他的技术体现,能够体如今代码中使用泛型,方法与方法之间的调用不是直接调用,而是使用托付.

       使用了泛型,就能够不用考虑数据的类型,从而做到统一的处理.就比方我们曾经写代码,每一个实体类相应一个DAL,然后每一个DAL里面都有增删改查的方法,每一个方法都是针对固定的类型来做的.Update实体A,则一定仅仅能更新实体A.可是使用了泛型就能够Update(<T>),这个T是什么类型,仅仅要你指定什么类型,他就是什么类型,T是实体A,就更新实体A,T是实体B就更新实体B.

        仅仅要类型不确定,你能够做非常多非常多的事.这也是符合我们的面向对象六个原则中的,依赖倒转,要依赖于抽象,而不是依赖于细节.

        而托付,则是为了减少方法与方法之间的依赖关系.高内聚低耦合一直是我们追求的.像是大话设计模式上的观察者模式,里面就使用了托付.我分析了一下,他为什么要使用托付.


         我開始认为,为什么这里要用托付,直接调用他们搁置的Close**()的方法不就能够实现各自的功能吗?后来一想

        注意一下,代码中的两个人,他们的行为都是被他们的Boss所刺激的,假设boss没有回来,他们是不会关了NBA或者股票的,仅仅有Boss回来,他们接收到消息之后,立刻做出响应,关了NBA/股票.所以他们的close方法都托付给了bossupdate事件,托付好了事件,bossnotify的方法中,运行完了update事件就開始运行托付中的方法.

        并且是在client托付的,就能够做到非常灵活的配置.假设有第三个人须要关闭网页,直接将第三个同事的Close网页的方法托付到update事件上,那么老板回来的时候就会有3个人立刻Close.并且这两个close方法位于不同的类其中,可是仅仅要把他们方法名放在托付中,仅仅要他们的方法和托付方法的參数和返回值类型都一样就能够,就能够将方法托付到update事件上,一样的处理.

       所以假设不在这里使用托付的话,直接调用tongshi1,tongshi2close方法,那么就是直接关闭NBA或者股票;可是实际情况是老板回来了,他们为了防老板,才关掉的,要不然是不会舍得自己关掉的.

       所以假设须要托付,则须要发送消息,被托付方须要可以接收到消息.在托付方发送消息之后,立刻对应,完毕各种的方法.而这样,托付将方法与方法之间的关系,由我来调用你,变成我有须要,发个消息,你来主动支持我,主动和被动的关系.

       以下是我关于托付查的一些资料:

        有人说为什么要用托付,由于使用托付使程序猿能够将方法引用封装在托付对象内。然后能够将该托付对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法

       但是我感觉这个并非原因,由于我认为托付的时候,是须要知道方法的,我认为他还是知道了调用哪个方法;既然我知道了调用哪个方法,我在client直接调用这种方法,我感觉也是能够的.

        我不大明确,在client调用方法能否够说是在执行时决定调用哪个方法,但我感觉他是.后来我查了一下,据说在编译时调用,类型是已经确定了的;而在执行时调用,类型是不确定的.那么假设我在client直接调用那些方法,依照正常思路,我会new出对象,然后调用他们的方法,我想他们应该类型已经确定了的.而我用托付,须要把方法作为參数放在托付中,我无法理解为什么说托付是在编译时不知道调用哪个方法,不是知道方法了吗?      

        还有人说:简单点说,仅仅要是程序运行过程中无法预知何时会运行的方法,都必须使用托付。程序不可能知道你什么时候会点击button。另外就是在扩展方法的时候也须要托付,假如你定义好了一段过程,有人想要在你的过程中加入�一些方法来处理特殊的工作,别人该不会要重写你的过程吧,这时候通过托付让你的过程去运行别人要加入�进来的特殊工作。(我不明确他是怎么做到通过托付让你的过程去运行别人要加入�进来的特殊工作,怎么加进来的??我感觉你的过程运行完之后,加入�进来还有可能,假设不是的话,你要改动你过程中的代码进行加入�吗?还是提前就预留好了位置,准备放别人的方法?不明确)

        还有人说,托付相当于给方法占个位(告诉程序这个地方将运行某一类方法,相当于一个托付书),并指明这个位置上将运行的方法的格式(返回类型,传入參数类型)

       在程序终于运行到该占位的时候,将根据此时绑定到该托付的方法来确定终于真正实现的逻辑。

       使用情况:知道传入和传出參数类型,但不确定详细实现逻辑的时候。

       C#里面有非常多托付,比方List<T>.Sort()方法就有一个重载叫List<T>.Sort(Comparison<T>comparison),这里面的參数         Comparison<T> comparison就是个托付,在详细排序的时候,将依据你传入的详细的方法来运行排序逻辑。

        由于这个特性,托付就常常会跟事件联系在一起,由于事件被触发(托付的方法被运行)之后要实现的逻辑,是不能定死的。就像是你触发buttonClick事件,可是Click事件之后是要做什么你是不知道的.你这次能够托付画幅画,下次能够弹个窗.

         还有这句话:托付,或者说是回调,或者也能够泛指事件通知机制.没错,就是通知,就是回调,我也是这么觉得的,嗯.

         老实说,我还是没怎么懂托付,还是不大会用,可是总比曾经一点都不知道托付是什么要好些.老有人说,用多了,就知道托付的优点了,我多用用吧!


原文地址:https://www.cnblogs.com/hrhguanli/p/3914432.html