委托模式
与其他面向对象编程语言如C++不同,C#提供了另外一种回调方式,就是委托。我理解委托就是对同一类方法的声明。声明一个委托后,就好比定义了一类具有相同输入参数和返回参数的方法。而不必理会这些方法的名字是什么,由哪些类来实现,也不用理这些方法到底是做什么用的。有可能这些方法所实现的功能大相径庭。委托只关心这些方法的输入参数和返回参数。如果没有返回参数的委托可以看作是“多播委托”。
初看委托,觉得它有些像接口。但细细体会却觉得还是有差别。差别就在于委托关心的一类方法,类似C++中的函数指针。而接口关心的具有相同数据或方法的类。
可以看到输出结果,并不是我所期望的每个公式后的有结果出现。只有最后一个除法有结果。那这说明什么问题呢。就是在多播委托时,只有一个结果被返回。但为什么不一定是最后一个方法调用呢。因为书上有说dotNet框架只保证会执行全部委托的方法,但不确保执行的顺序是按照加入的顺序。这里测试几次都是最后一个结果被返回。有可能是因为我测试的量不够大。所以看不到其他的情况出现。
洪虎
2006-10-10
初看委托,觉得它有些像接口。但细细体会却觉得还是有差别。差别就在于委托关心的一类方法,类似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
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