zoukankan      html  css  js  c++  java
  • .net难点一:事件和委托(诙谐版)

         很多朋友在学习C#的过程中感到比较头疼的一个难题就是事件和委托,灵活应用事件和委托是提升.net水平的一个关键,
    而如何正确理解事件和委托是根本所在。本文试着用一种诙谐通俗的说法给你讲解事件和委托,在笑笑之余,深刻理解和记忆
    什么是事件和委托。

         故事一:现代社会生活节奏太快,很多人忙于工作而无暇顾及感情问题,因此特别是我们IT界出现很多钻石王老五。呵呵,
    因此现在出现了如何和陌生美女搭讪的培训班。现在模拟下整个培训过程[本故事构思来源于sohu的一篇文章]。

         阶段一:什么都要老师教。
         学生甲:遇到活泼类型美女怎么搭讪?老师:搭讪方法(美女类型 活泼类型)
         学生已:遇到文静类型美女怎么搭讪?老师:搭讪方法(美女类型 文静类型)
         学生丙:遇到职业白领类型美女怎么搭讪?老师:搭讪方法(美女类型 职业白领类型)
          ........................
     如此下去,各学生开始去实验了
     public void 实验(美女a)
     {
      if(美女a.类型==活泼类型)
      {
       搭讪方法(美女类型 活泼类型);
      }
      else if(美女a.类型==文静类型)
      {
       搭讪方法(美女类型 文静类型);
      }
      else if(美女a.类型==职业白领类型)
      {
       搭讪方法(美女类型 职业白领类型);
      }
      .....................
     }
     
        阶段二:学会综合应用了,会同时用老师教的几种方法了。因为人的性格是多样的,因此对同一美女只有一种方法还不行,所以有的人学会了对一个人用多种方法。
     如果按照阶段一的水平,老师又得提供了以下几个方法。
     
     public void 搭讪方法1(文静和职业白领综合类型 某类型美女)
     {
                   搭讪方法(美女类型 文静类型); 
                   搭讪方法(美女类型 职业白领类型);
     }
     
     public void 搭讪方法2(活泼和职业白领类型 某类型美女)
     {
                  搭讪方法(美女类型 活泼类型); 
                  搭讪方法(美女类型 职业白领类型);
     }
     
     
     学生又开始试验了

     //这次我们遇到美女b,是文静和职业白领综合类型。
     搭讪方法1(美女b);

     //美女c,是活泼和职业白领类型,那得又写个方法了
     搭讪方法2(美女c)

     //碰到美女d,是.....类型,那又得写个搭讪方法3了。
     搭讪方法3(美女d)

     长此以往写的累啊,我们能不能写个类之类的东西(委托就是一种特殊的类,最后给大家总结)来代表所有的方法(注意这个类是用来代表方法的,专业一点是方法的引用,或指向方法的指针)。当然可以了,程序员的最高使命就是实现,没什么不可能的。于是我们定义个委托(特别的类)来代表方法。

     public delegate void 搭讪方法的委托(美女类型 某种类型);[注:为什么写搭讪方法的委托,大家要从字面上理解,这个东西就是来委托真的要执行的那个方法去执行的。]

     这样在泡MM的时候,老师只告诉他下面一个方法就好了

     public void 老师提供的搭讪方法(美女类型 某类型,搭讪方法 某方法)
     {
      
     }

     那么学生如何去具体做呢?

     public void 实验(美女类型 b类型美女)
     {
      //首先是文静类型的
      搭讪方法的委托 b类型美女搭讪要委托执行的方法= 搭讪方法(美女类型 文静类型);
      
      //其次是职业白领类型的
      b类型美女搭讪要委托执行的方法 += 搭讪方法(美女类型 职业白领类型);

      //添加完你要委托的方法,开始具体泡MM了
      老师提供的搭讪方法(b类型美女,b类型美女搭讪要委托执行的方法);
     }

     看到了么,碰到了美女,你想用哪种方法就加哪种方法,不用if-else来判断了,不错吧。


     阶段三:青出于蓝而胜于蓝的阶段,还会自己创造老师没有的方法来泡MM。这次我们对刚提到的委托固定一个引用,(前面是每个MM我们要声明一个委托,然后在这个委托的基础上加搭讪的方法)以后甭管咋样,我都用这个固定的委托来添加方法。

     public event 搭讪方法的委托  搭讪事件[注:其实就是固定一个委托的引用,以后都用这个了,不许自己定义];

     这时用不着老师,自己会创造了,出山了。
     
     public void 实验(美女类型 超级美女M)
     {
      搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法一(超级美女M));
      搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法二(超级美女M));
      搭讪事件+=new 搭讪方法的委托(自己创造的搭讪方法三(超级美女M));
      
      //想用多少种方法,自己自由发挥啊
      .............................
     }

     private void 自己创造的搭讪方法一(美女类型 m)
     {
      //自己自由发挥
     }

     private void 自己创造的搭讪方法二(美女类型 m)
     {
      //自己自由发挥
     }

     private void 自己创造的搭讪方法三(美女类型 m)
     {
      //自己自由发挥
     }

     总结一下:委托就是对方法的抽象,事件就是对委托的固定引用,对这个委托常例化。就像我们的按钮事件,a按钮点击调用一个方法,b按钮点击调用一个方法,后来我们对按钮的点击都抽象成固定成Click事件,然后你想添加什么方法就添加什么方法。这篇文章所写的方法,具体是客户端(调用端)的还是服务端的可能大家有些混淆,搭讪方法都是老师教的(老师类,服务端),除了后来自己创造的。实验方法都是客户端(调用端)。

     补充:本来还准备给大家准备个故事的,还给大家结合设计模式谈谈委托和事件的,没想到写第一故事就这么占版面,就算了。我想大家好好理解这个就差不多了,然后看看其他blog里关于委托和事件的文章,我相信你一定能突破这个难点的。祝你成功!欢迎大家拍砖批评和指正,不胜感激!

    作者:Jackhuclan
    出处:http://jackhuclan.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    并发基础(一) 线程介绍
    java基础(九) 可变参数列表介绍
    全球 43 亿 IPv4 地址已耗尽!IPv6,刻不容缓
    IPv6,无需操作就可升级?
    为什么 HTTPS 比 HTTP 安全
    从《国产凌凌漆》看到《头号玩家》,你就能全面了解5G
    再谈 APISIX 高性能实践
    API 网关的选型和持续集成
    尹吉峰:使用 OpenResty 搭建高性能 Web 应用
    鱼和熊掌可兼得?一文看懂又拍云 SCDN
  • 原文地址:https://www.cnblogs.com/jackhuclan/p/1536432.html
Copyright © 2011-2022 走看看