zoukankan      html  css  js  c++  java
  • 委托,深入浅出才是王道(二)

    对于委托的理解方式可能每个人都不尽相同,正所谓1000个人心中有1000个哈姆雷特!

    笔者以一种较容易理解的方式太陈述,可能更适合新手,各路大神砖家们请勿喷,感激不尽!!!

    回顾一下上一篇的demo代码,有一些小的改动:

    View Code
     1 using System;
     2 
     3 namespace DelegateTest
     4 {
     5     class Program
     6     {
     7         static void Main(string[] args)
     8         {
     9             const string ch_name = @"张三";
    10             const string en_name = @"zhangsan";
    11             PepoleClass pc = new PepoleClass();
    12             PepoleClass.SpeakDelegate del_1 = pc.SpeakEnglish;
    13             PepoleClass.SpeakDelegate del_2 = pc.SpeakChinese;
    14             
    15             pc.SpeakOperate(ch_name,del_1);
    16             pc.SpeakOperate(en_name,del_2);
    17             Console.ReadLine();
    18         }
    19     }
    20     public class PepoleClass
    21     {
    22         public void SpeakChinese(string name)
    23         {
    24             Console.WriteLine("你好,{0}", name);
    25         }
    26 
    27         public void SpeakEnglish(string name)
    28         {
    29             Console.WriteLine("Hello,{0}", name);
    30         }
    31         //定义委托
    32         public delegate void SpeakDelegate(string name);
    33         public void SpeakOperate(string name, SpeakDelegate speak_method)
    34         {
    35             speak_method(name);
    36         }
    37     }
    38 }

    上一篇地址http://www.cnblogs.com/error500/archive/2012/09/14/2684321.html

    前面说过委托也是一个类,可以将方法当作另一个方法的参数来传递,这里没有直接传入方法名,而是定义了两个基于委托的变量,可能更好理解。其实在javascript里面也有一中类似的用法,有时候我们会将一个函数名传给第二个函数,第二个函数会根据函数名执行函数,例如:

    <script type="text/javascript">
      func_handle(func_operate);
      function func_handle(func_name){
        func_name();
      }
      function func_operate(){
        alert("看我像委托吗?");
      }
    </script>

    言归正传,多播委托。首先要说明的一点是,多播委托相关的方法必须是void无返回值的方法。

    多播委托就是可以将多个方法赋值给同一个委托,当调用这个委托的时候,将依次调用所绑定方法,语法如下:

    static void Main(string[] args)
    {
        const string name = @"张三";
        PepoleClass pc = new PepoleClass();
        //给委托类型的变量赋值
        //PepoleClass.SpeakDelegate del_variable = new PepoleClass.SpeakDelegate(pc.SpeakEnglish);
        PepoleClass.SpeakDelegate del_variable = pc.SpeakEnglish;
        //再给此委托绑定一个方法,取消绑定使用-=:del_variable -= pc.SpeakChinese;
    //直接使用=:del_variable = pc.SpeakChinese;会覆盖前面绑定的方法
    del_variable += pc.SpeakChinese; pc.SpeakOperate(name, del_variable);//先调用SpeakEnglish再调用SpeakChinese Console.ReadLine(); }

  • 相关阅读:
    GGEditor
    Vue 项目(HTML5 History 模式) 部署服务器
    mysql连接状态
    mysql连接状态
    HBase配置性能调优
    HBase配置性能调优
    spark streaming检查点使用
    spark streaming检查点使用
    spark streaming的有状态例子
    spark streaming的有状态例子
  • 原文地址:https://www.cnblogs.com/error500/p/2685959.html
Copyright © 2011-2022 走看看