zoukankan      html  css  js  c++  java
  • 委托模式

    与其他面向对象编程语言如C++不同,C#提供了另外一种回调方式,就是委托。我理解委托就是对同一类方法的声明。声明一个委托后,就好比定义了一类具有相同输入参数和返回参数的方法。而不必理会这些方法的名字是什么,由哪些类来实现,也不用理这些方法到底是做什么用的。有可能这些方法所实现的功能大相径庭。委托只关心这些方法的输入参数和返回参数。如果没有返回参数的委托可以看作是“多播委托”。

    初看委托,觉得它有些像接口。但细细体会却觉得还是有差别。差别就在于委托关心的一类方法,类似C++中的函数指针。而接口关心的具有相同数据或方法的类。

     1using System;
     2using System.Collections;
     3
     4namespace Exam
     5{
     6    // 这里定义一个委托,用以表示所有对整形数字A和B进行处理后返回整形数据的方法
     7    public delegate int CountMethodDelegate(int a, int b);
     8
     9    class Class1
    10    {
    11        // 下面定义一些对A和B进行处理的方法
    12
    13        // 加法
    14        static int Plus(int a, int b)
    15        {
    16            Console.WriteLine(a.ToString() + "+" + b.ToString() +" = ");
    17            return a + b;
    18        }

    19
    20        // 减法
    21        static int Minus(int a, int b)
    22        {
    23            Console.WriteLine(a.ToString() + "-" + b.ToString() + " = ");
    24            return a - b;
    25        }

    26
    27        // 乘法
    28        static int Multiply(int a, int b)
    29        {
    30            Console.WriteLine(a.ToString() + "*" + b.ToString() + " = ");
    31            return a * b;
    32        }

    33
    34        // 除法
    35        static int Divide(int a, int b)
    36        {
    37            Console.WriteLine(a.ToString() + "/" + b.ToString() + " = ");
    38            if (b != 0)
    39                return a / b;
    40            else
    41                return 0;
    42        }

    43
    44        [STAThread]
    45        static void Main(string[] args)
    46        {
    47            int A, B;
    48            A = 100;
    49            B = 7;
    50
    51            // 连续向这个委托的实例添加方法。
    52            CountMethodDelegate test = new CountMethodDelegate(Plus);
    53            test += new CountMethodDelegate(Minus);
    54            test += new CountMethodDelegate(Multiply);
    55            test += new CountMethodDelegate(Divide);
    56
    57
    58            // 调用委托test所代表的方法,同时传递他需要的参数A和B。
    59            // 一次调用,执行所有方法。
    60            Console.Write(test(A, B));
    61
    62            Console.ReadKey();
    63        }

    64    }

    65}

    66

    可以看到输出结果,并不是我所期望的每个公式后的有结果出现。只有最后一个除法有结果。那这说明什么问题呢。就是在多播委托时,只有一个结果被返回。但为什么不一定是最后一个方法调用呢。因为书上有说dotNet框架只保证会执行全部委托的方法,但不确保执行的顺序是按照加入的顺序。这里测试几次都是最后一个结果被返回。有可能是因为我测试的量不够大。所以看不到其他的情况出现。


    洪虎

    2006-10-10
  • 相关阅读:
    Linux安装zookeeper以及部署dubbo-admin
    springboot+layui+mybatis-plus的批量删除(批量修改)
    springboot打包jar与war包
    drf-books系列接口作业和分页器
    drf-过滤排序异常处理封装Response对象
    drf-认证权限频率
    drf-路由组件
    视图组件
    请求和响应
    Serializer和ModelSerializer
  • 原文地址:https://www.cnblogs.com/eric1394/p/525804.html
Copyright © 2011-2022 走看看