zoukankan      html  css  js  c++  java
  • 委托[delegate]_C#

    委托(delegate):

    委托声明定义了一种类型,它用一组特定的参数以及返回类型来封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果您有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。

    下面看一段代码:

    using System ;

    delegate void EatDelegate(string food);

    class MyDelegate

    {

           static void zsEat(string food)

           {

                  Console .WriteLine ("张三吃"+food);

           }

           static void lsEat(string food)

           {

                  Console .WriteLine ("李四吃"+food);

           }

           static void wwEat(string food)

           {

                  Console .WriteLine ("王五吃"+food);

           }

           static void Main()

           {

                  EatDelegate zs=new EatDelegate (zsEat );         //C#2.0语法:   

    EatDelegate zs=zsEat ;

     

                  EatDelegate ls=new EatDelegate (lsEat );          

     

                  EatDelegate ww=new EatDelegate (wwEat );

     

                  EatDelegate eatChain=null;

     

                  Console .WriteLine ("座谈会开始");

     

                  eatChain = zs+ls+ww;

     

                  eatChain ("西瓜");

     

                  Console .WriteLine ("李四出去接电话");

     

                  eatChain -=ls;

     

                  eatChain ("香蕉");

     

                  Console .WriteLine ("李四回来了");

     

                  eatChain +=ls;

     

                  eatChain ("桔子");

     

                  //下面是匿名方法¨

     

                  eatChain += delegate(string food) {Console .WriteLine ("我吃"+food);   };

     

                  eatChain += delegate(string food) {Console .WriteLine ("你吃"+food);   };

     

                  eatChain += delegate(string food) {Console .WriteLine ("他吃"+food);   };

     

                  eatChain ("饭");

     

           }

     

    }

     

    下面是实例方法的一段代码:

     

    using System ;

     

    delegate void EatDelegate(string food);

     

    class Man

     

    {

     

           private string name;

     

           public Man(string name)

     

           {

     

                  this .name =name ;

     

           }

     

           public void eat(string food)

     

           {

     

                  Console .WriteLine (name+"吃"+food);

     

           }

     

    }

     

    class Party

     

    {

     

           static void Main()

     

           {

     

                  Man ZS=new Man ("张三");

     

                  Man LS=new Man ("李四");

     

                  Man WW=new Man ("王五");

     

                 

     

                  EatDelegate zs=new EatDelegate (ZS.eat );

     

                  EatDelegate ls=new EatDelegate (LS.eat );

     

                  EatDelegate ww=new EatDelegate (WW.eat );

     

                  EatDelegate eatChain=null;

     

                  Console .WriteLine ("座谈会开始");

     

                  eatChain = zs+ls+ww;

     

                  eatChain ("西瓜");

     

                  Console .WriteLine ("李四出去接电话");

     

                  eatChain -=ls;

     

                  eatChain ("香蕉");

     

                  Console .WriteLine ("李四回来了");

     

                  eatChain +=ls;

     

                  eatChain ("桔子");

     

           }

     

    }

     

    委托可作为方法的参数进行动态调用,看下面代码:

     

    using System ;

     

    delegate void EatDelegate(string food);

     

    class Man

     

    {

     

        private string name;

     

        public Man(string name)

     

        {

     

           this .name =name ;

     

        }

     

        public void eat(string food)

     

        {

     

           Console .WriteLine (name+""+food);

     

        }

     

    }

     

    class Party

     

    {

     

        static void eatTogether(string food,params EatDelegate [] values)

     

        {

     

           if (values ==null )

     

           {

     

               Console .WriteLine ("座谈会结束");

     

           }

     

           else

     

           {

     

               EatDelegate eatChain=null ;

     

               foreach (EatDelegate ed in values )

     

                  eatChain +=ed;

     

               eatChain (food);

     

               Console .WriteLine ();

     

           }

     

        }

     

        static void Main()

     

        {

     

           Man ZS=new Man ("张三");

     

           Man LS=new Man ("李四");

     

           Man WW=new Man ("王五");

     

          

     

           EatDelegate zs=new EatDelegate (ZS.eat );

     

           EatDelegate ls=new EatDelegate (LS.eat );

     

           EatDelegate ww=new EatDelegate (WW.eat );

     

          

     

           Console .WriteLine ("座谈会开始");

     

           eatTogether("西瓜",zs,ls,ww);

     

           Console .WriteLine ("李四出去接电话");

     

            eatTogether("香蕉",zs,ww);

     

           Console .WriteLine ("李四回来了");

     

            eatTogether("桔子",zs,ls,ww);

     

            Console .WriteLine ("座谈会结束");

     

            eatTogether (null ,null );

     

     

     

        }

     

    }

     

  • 相关阅读:
    关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
    【设计模式】抽象工厂模式
    spring mvc4.1.6 + spring4.1.6 + hibernate4.3.11 + mysql5.5.25 开发环境搭建及相关说明
    struts2.3.24 + spring4.1.6 + hibernate4.3.11+ mysql5.5.25开发环境搭建及相关说明
    git中Please enter a commit message to explain why this merge is necessary.
    扒一扒开源世界有哪些licenses?
    string.Format出现异常:输入字符串的格式不正确 Exception during StringFormat
    node-glob学习
    js中对URL进行转码与解码
    程序员如何修炼管理思维
  • 原文地址:https://www.cnblogs.com/0515offer/p/4191897.html
Copyright © 2011-2022 走看看