zoukankan      html  css  js  c++  java
  • 委托-张子扬博客

        前面一篇已经讲述了为什么使用委托,以及使用委托有什么好处,今天再此学习张子扬博客逐步了解委托。

         1. 方法作为方法的参数

          这个看起来很别扭,和C++中出现函数指针有点类似,只是函数参数是一个指针而已。

    public void GreetPeople(string name, *** MakeGreeting)
    

         ***只是这个指针类型而已;  

    首先:

     1  public void chineseGreet(string name)
     2  {
     3      Console.WriteLine("{0}  你好 ", name);
     4  }
     5  public void englishGreet(string name)
     6  {
     7      Console.WriteLine("{0}  Hello", name);
     8  }
     9  public enum Language
    10  {
    11     English, Chinese
    12  }
    13 
    14  public void GreetPeople(string name, Language lang)
    15  {
    16     //做某些额外的事情,比如初始化之类,此处略
    17     swith(lang)
    18     {
    19         case Language.English:
    20            EnglishGreeting(name);
    21            break;
    22        case Language.Chinese:
    23            ChineseGreeting(name);
    24            break;
    25     }
    26  } 

    上述就是两个语种的打招呼语句,但如果是多种语言,就必须写足够多方法,有点费事,

    为解决上述麻烦,委托就可以使用:

    public delegate void greet(string name);

    看到上述声明,其相比于之前定义方法,只是多了 delegate,其余得如参数,返回值类型都完全一致;

    现在可以重新定义:

     public void GreetPeople(string name,GreetingDelegate MakeGreeting)

    将委托作为了方法参数;

    下面是完整代码:

    namespace Delegate {
        
        //定义委托,它定义了可以代表的方法的类型
        public delegate void GreetingDelegate(string name);
        
        class Program {
    
           private static void EnglishGreeting(string name) {
               Console.WriteLine("Morning, " + name);
           }
    
           private static void ChineseGreeting(string name) {
               Console.WriteLine("早上好, " + name);
           }
    
           //注意此方法,它接受一个GreetingDelegate类型的方法作为参数
           private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
               MakeGreeting(name);
            }
    
           static void Main(string[] args) {
               GreetPeople("Jimmy Zhang", EnglishGreeting);   //这两行代码的使用,是如何调用委托,相比于switch语句简洁性
               GreetPeople("张子阳", ChineseGreeting); 
               Console.ReadKey();
           }
        }
    }

    2. 方法绑定委托

    如前文所述,委托既然可以作为类,那就可以定义一个变量像普通变量一样完成赋值初始化,

    GreetingDelegate delegate1, delegate2;
    delegate1 = EnglishGreeting;
    delegate2 = ChineseGreeting;

    但委托变量又不像普通变量一样,它可以绑定多个方法;

     GreetingDelegate delegate1;
     delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
     delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

    也可以new一个出来;

    GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);

    下面是自己针对前文所学写的,学会使用委托,以及定义,赋值,绑定,以 new委托变量完成初始化:

        public class greetClass
        {
            public void chineseGreet(string name)
            {
                Console.WriteLine("{0}  你好 ", name);
            }
            public void englishGreet(string name)
            {
                Console.WriteLine("{0}  Hello", name);
            }
        }
    
        public delegate void greet(string name);
    
        /// <summary>
        /// 纯粹是为了将委托作为函数参数使用
        /// </summary>
        public class greetDelegate
        { 
            public void makeGreet(string name,greet greeting)
            {
                greeting(name);
            }
        }
    
            static void Main(string[] args)
            {
                greetClass k_greetClass = new greetClass();
                greetDelegate g_greetDelegate = new greetDelegate();
                //委托可以作为函数的参数,像C++中函数指针一样传递函数的地址即可,只是这里是引用而已
                g_greetDelegate.makeGreet("洋洋", k_greetClass.chineseGreet);
                g_greetDelegate.makeGreet("Young", k_greetClass.englishGreet);
    
                //既然委托可以当作一个类,那们他就会对象,可以对对象进行初始化等
    
                greet greetDelegate1, greetDelegate2;//两个委托型变量,下面两中方法,一个委托变量还可以绑定多个方法
                greetDelegate1 = new greet(k_greetClass.chineseGreet);
                greetDelegate1 += k_greetClass.englishGreet;
                greetDelegate2 = k_greetClass.englishGreet;
    
                g_greetDelegate.makeGreet("洋洋", greetDelegate1);
                g_greetDelegate.makeGreet("Young", greetDelegate2);
    
                Console.ReadKey();
            }
  • 相关阅读:
    正则表达式---用户验证
    最短路 Dijkstra
    最短路 Dijkstra+堆优化
    LCIS(最长公共上升子序列)
    最小生成树 Kruskal
    网络流 最大流
    网络流 最小费用最大流
    树链剖分
    树状数组
    双重Hash
  • 原文地址:https://www.cnblogs.com/xingyuanzier/p/12196301.html
Copyright © 2011-2022 走看看