zoukankan      html  css  js  c++  java
  • 委托的概念

    有时我们需要将一个函数作为另一个函数的参数,这时就要用到委托Delegate机制。委托是一个较难讲清楚的概念,笔者苦思数日,终于想出了一个巧妙的例子。

           下面我们设计一个马戏表演函数RunCircus(),它的第一个参数是代表动物的函数,传给它什么样的动物,就进行什么动物的表演。请新建一个名为“Delegate”的项目,然后添加如下代码。

    试一试:定义委托

            //《C#初学课堂》     
            //
    函数:狗表演

            static void DogAct(string name)

            {

                Console.WriteLine("Hello,I am " + name + "!");

                Console.WriteLine(@"

                        .----.

                     _.'__    `.

                 .--(#)(##)---/#"

               .' @          /###"

               :         ,   #####

                `-..__.-' _.-"###/

                      `;_:    `''

                    .'''''''`.

                   /,Snoopy ,"

                  // COOL! ""

                  `-._______.-'

                 ___`. | .'___

                 (______|______)");

     

            }

     

            //函数猫表演

            static void CatAct(string name)

            {

                Console.WriteLine("Hello,I am " + name + "!");

                Console.WriteLine(@"

                  .-. __ _ .-.

                   | ` / " |

                   /     '.()--"

                  |         '._/

                 _| O   _   O |_

                 ="    '-'    /=

                   '-._____.-'

                   /`/"___/"`"

                  /"/o     o"/"

                 (_|         |_)

                   |____,____|

                   (____|____)");

     

            }

     

            //函数:狮子表演

            static void LionAct(string name)

            {

                Console.WriteLine("Hello,I am " + name + "!");

                Console.WriteLine(@"

                          ,%%%%%%%%,

                         ,%%/"%%%%/"%%

                        ,%%%"c "" J/%%%

              %.       %%%%/ o o "%%%

              `%%.     %%%%    _ |%%%

                `%%     `%%%%(__Y__)%%'

                //       ;%%%%`"-/%%%'

               ((       / `%%%%%%%'

                ""    .'          |

                 "" /       " | |

                  ""/         ) | |

                   "         /_ | |__

                   (___________)))))))");

     

            }

     

           //定义委托

            delegate void AnimalAct(string name);

     

            //函数:马戏表演(第一个参数为AnimalAct型委托)

            static void RunCircus(AnimalAct animalAct, string name)

            {

                animalAct(name);

            }

     

            static void Main(string[] args)

            {

               //把函数DogAct()转换为AnimalAct型委托

                AnimalAct deleDogAct = new AnimalAct(DogAct);

                //把委托deleDogAct传给函数RunCircus()

                RunCircus(deleDogAct, "Snoopy");

     

                //把函数CatAct()转换为AnimalAct型委托,并传给函数RunCircus()

                RunCircus(new AnimalAct(CatAct), " Kitty ");

     

            }

               

                运行结果如下:

    7.JPG
         《C#初学课堂》

    函数RunCircus(AnimalAct animalAct, string name)的第一个参数实际上是一个代表动物的函数,传给它什么样的函数,它就用什么样的动物进行表演。但为了进行严格的类型检查,我们不能直接把函数的名称传递给它,而应先定义一个委托(Dlelegate),即定义一种“函数类型”。

    8.JPG

           委托用关键字delegate声明,上面的语句定义了一种名为AnimalAct的委托(函数类型),明确规定了委托的参数类型和返回值类型。当我们需要把某个函数作为参数时,就要先把它转换为委托实例。

    9.JPG


       然后把这个委托实例以参数的形式传递给调用它的函数。


    13.JPG

    由此可以看出委托实例deleDogAct实际上是函数DogAct()的别名,显然委托和被委托函数应具有相同的参数类型和返回类型。

    在我们的程序中,马戏团总是调用函数RunCircus()进行表演。定义函数RunCircus()时,我们不知道也不关心传递给它的委托代表哪个函数,直到调用RunCircus()函数,并把实际参数传递给它时,这个函数才具体化。传给它什么样的实际参数,就进行什么样的表演,传给它deleDogAct委托,马戏团就进行狗的表演;传给它deleCatAct委托,马戏团就进行猫的表演;传给它deleLionAct委托,马戏团就进行狮子表演。因此以委托为参数的函数具有一定的通用性

  • 相关阅读:
    Codeforces 691A Fashion in Berland
    HDU 5741 Helter Skelter
    HDU 5735 Born Slippy
    HDU 5739 Fantasia
    HDU 5738 Eureka
    HDU 5734 Acperience
    HDU 5742 It's All In The Mind
    POJ Euro Efficiency 1252
    AtCoder Beginner Contest 067 C
    AtCoder Beginner Contest 067 D
  • 原文地址:https://www.cnblogs.com/dajiang02/p/1372390.html
Copyright © 2011-2022 走看看