.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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/jackhuclan/p/1536432.html