zoukankan      html  css  js  c++  java
  • 委托

    首先要知道什么是委托。用通俗易懂的话来讲,可以把委托看成是用来执行方法(函数)的一个容器。在使用委托时,可以像对待一个类一样对待它。即先声明,再实例化。两者只有一点不同,类在实例化之后叫对象或实例,但委托在实例化之后仍叫委托。如:

    delegate double MathsOp(double x);

    以上声明了一个委托,该委托的意义是任何一个返回值为double且只有一个形象为double 的函数都可以用这个委托来调用。要将委托实例化。首先要有一个满足委托声明的方法。假设有如下的返回一个数的2倍的方法:

    class MathsOperations

    {

      public static double MultiplyBy2(double value)

      {

        return value*2;

      }

    }

    有了这样一个方法,就可以实例化一个委托了:

    MathsOp operation=new MathsOp(MathsOperations.MultiplyBy2)

    在实例化一个委托时,要给它一个参数,这个参数就是要委托执行的方法,它可以是静态方法,也可以是实例方法,例如:

    MathsOp operation=new MathsOp(new Class1().Method1);

    在实例化完一个委托之后,就可以用这个委托来调用方法了:

    double result=operation(1.23);

    整个代码如下:

    namespace MydelegateSpace

    {

      delegate double MathsOp(double x);

      class Start

      {

        public class MyDelegate

        {

          public static double MultiplyBy2(double x)

          {

            return x*2;    

          }

        }

      }

      static void Main(string[] args)

      {

         MathsOp operation=new MathsOp(MyDelegate.MultiplyBy2);

         double x=1.23;

         double result=operation(x);

         Console.WriteLine("{0}multiply by 2 is {1}",x,result);

         Console.Read();

      }

    }

    运行结果为:

    1.23 multiply by 2 is 2.46

    多路广播委托

    前面使用的委托只包含一个方法调用。调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要多次显示调用这个委托。其实委托也可以包含多个方法,这种委托就是多路广播委托。多路广播委托派生于System.MulticastDelegate,它的Combine方法允许把多个方法调用在一起,可以通过+=来向委托添加调用方法,也可以用-=删除其中的调用方法。如:

    namespcae MydelegateSpace

    {

      public class MyDelegate

      {

        public static void MultiplyBy2(double value)

        {

          double result=value*2;

          Console.WriteLine("Multiplying by 2:{0} gives{1}",value,result);

        }

        public sttaic void Squre(double value)

        {

          double result =value*value;

          Console.WriteLine("Squreing:{0}geves{1}",value,result);

        }

      }

      delegate void MathsOp(doube x);

      class Start

      {

        static void Main(string[]args)

        {

          MathsOp operation=new MathsOp(MyDelegate.MultiplyBy2)    ;

          operation+=new MathsOp(Mydelegate.Squre);

          double x=1.23;

          operation(x);

          operation-=new MathsOp(MyDelegate.MultiplyBy2);

          operation(x);

          Console.Read();

        }

      }

    }

    输出的结果如下:

    Multiplying by 2:1.23gives 2.46

    Squaring:1.23 gives 1.5129

    Squaring:1.23 gives 1.5129

    注意:多路广播委托声明时必须返回void ,否则返回值不知道应该送他到什么地方。

    为什么要用委托呢?使用委托是程序猿可以将方法引用封装在委托对象内。然后可以将委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中函数的指针不同,委托是面向对象,而且是类型安全的。

  • 相关阅读:
    [转载]四大Java EE容器
    [转载]javaEE规范和SSH三大框架到底有什么关系
    javaee包含的服务和组件
    Java类文件最大限制
    oracle给字段添加描述
    apache commons工具包
    redis教程
    git学习
    编程人物
    程序员必须了解的5大编程准则
  • 原文地址:https://www.cnblogs.com/yk1992/p/3587591.html
Copyright © 2011-2022 走看看