posts - 34, comments - 19, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2006年10月11日

与其他面向对象编程语言如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

posted @ 2006-10-11 01:38 Eric yang 阅读(156) 评论(4) 编辑

下面是我学习接口模式的摘抄,和一些心得。

按照接口的定义方法,他是一些方法和字段的一个集合。通过使用接口可以简化编码,提高效率。下面就看一个例子从中体会一下使用接口的好处。


 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace Lesson10
 6{
 7    // 定义一个表示所有物品的接口
 8    // 这个接口有一个字段表示这个物品的名字
 9    // 有一个方法用来显示这个物品的信息
10
11    public interface Objects
12    {
13        string Name get;}
14        void ShowInf();
15    }

16
17    // 定义一个桌子类
18    class Table : Objects
19    {
20        private string name;
21
22        public Table(string name)
23        {
24            this.name = name;
25        }

26
27        public string Name
28        {
29            get return name; }
30        }

31
32        public void ShowInf()
33        {
34            Console.WriteLine("这是一个" + name + " 长:120  宽:60  高:90");
35        }

36    }

37
38    // 定义一个键盘类
39    class Keyboard : Objects
40    {
41        private string name;
42
43        public Keyboard(string name)
44        {
45            this.name = name;
46        }

47
48        public string Name
49        {
50            get return name; }
51        }

52
53        public void ShowInf()
54        {
55            Console.WriteLine("这是一个" + name + " 长:60  宽:15  厚:3");
56        }

57    }

58
59    class Program
60    {
61        static void Main(string[] args)
62        {
63            Objects test = new Table("电脑台");
64
65            CustMethod(test);                           // 注意这里传入的是一个Objects接口的一个实例
66
67            CustMethod(new Keyboard("标准键盘"));       // 注意这里传入的是一个KeyBoard类的一个对象实例
68
69            Console.ReadKey();
70        }

71
72        // 注意这里传递的是一个接口的实例,而不是一个普通的对象
73        // 这个方法可以看作是对所有实现这个接口的对象按照接口所定义的属性或方法,来操作这些对象的通用方法
74        // 这样做可以减少代码编写工作量,把相同的操作。或对具有相同方法或属性的一批对象实现一个通用的方法
75        public static void CustMethod(Objects objects)
76        {
77            Console.WriteLine(objects.Name);
78            objects.ShowInf();
79        }

80    }

81
82}

83

通过这段代码可以看到,如果对某一类具有相同属性或方法的对象进行操作时,可以对这些对象进行一些统一的操作。

例如:可能我们需要显示不同数据源中数据集的明细,这样我们需要一个统一的方法来显示来自不同数据集的数据,又可能这些数据源提供的数据是各种各样的。这是我们就可以定义这样一个接口,他有一个方法该方法返回一个DataSet数据集。然后给每个数据源,创建一个类。这些类都实现这个接口所定义的返回DataSet数据集的方法。这样一来,我们就可以通过另外一个通用方法来吧这些表示不同数据源类的对象所包含的数据进行显示了。

类似的应用情景还有很多。需要大家在实际项目中体会。


洪虎

2006-10-10

posted @ 2006-10-11 01:04 Eric yang 阅读(141) 评论(0) 编辑