==========================================
比较下面代码(注掉comment 1 || 注掉comment 2) 具体区别参考cs0071

2

3

4

5

6



7

8

9

10

11



12

13

14

15

16



17

18



19

20

21

22

23



24

25

26

27

28

29



30

31



32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49



50

51

52

53

54



55

56

57

58

59

60

61

62

63

下面是实际中用接口调用:(其中comment 1中的部分我采用了显式实现)

2

3

4

5

6



7

8

9

10

11

12



13

14

15

16

17



18

19



20

21

22

23

24



25

26

27

28

29

30



31

32



33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50



51

52



53

54

55

56

57



58

59

60

61

62

63

64

65

可以看出,comment 2不能显式实现,因此,对于实现两个不同的接口的两个相同名称的事件就
只能用comment 1中的方法了。
========================================
using System;delegate double Function(double x); // 代理函数
class Multiplier
{
double factor;
public Multiplier(double factor)
{
this.factor = factor;
}
public double Multiply(double x)
{
return x * factor;
}
}
public interface IFun
{
double Function(double x);
}
class funImp1 : IFun
{
double factor;
public funImp1(double factor)
{
this.factor = factor;
}
public double Function(double x)
{
return x * factor;
}
}
class funImp2 : IFun
{
public double Function(double x)
{
return Math.Sin(x);
}
}
class Test
{
static double Square(double x)
{
Console.WriteLine("1 静态方法 static double Square(double x)");
return x * x;
}
static double[] Apply(double[] a, Function f)
{
Console.WriteLine("2 double[] Apply(double[] a, Function f) " + f );
double[] result = new double[a.Length];
for (int i = 0; i < a.Length; i++) result[i] = f(a[i]); // 自己使用当成函数名称
return result;
}
static double[] Apply(double[] a, IFun f)
{
Console.WriteLine("2 double[] Apply(double[] a, Function f) " + f);
double[] result = new double[a.Length];
for (int i = 0; i < a.Length; i++) result[i] = f.Function(a[i]); // 调用接口中制定的方法
return result;
}
static void Main()
{
double[] a =
{ 0.0, 0.5, 1.0 };
double[] squares = Apply(a, new Function(Square));
double[] sines = Apply(a, new Function(Math.Sin));
Multiplier m = new Multiplier(2.0);
Function f = new Function(m.Multiply);
double[] doubles = Apply(a, f );
double[] b =
{ 0.1, 0.5, 1.0 };
doubles = Apply(b, f );
IFun ifun = new funImp1(2);
doubles = Apply(a, ifun );
Console.WriteLine(" "+doubles);
}
}
=======================================
来自微软的MSDN
在以下情况下使用Delegates很有用:
- 调用一个单一方法;
- 一个类要进行方法规范(method specification)的多种执行;
- 使用一个静态方法来执行规范;
- 想获得类似事件设计的模式;
- 调用者没有必要知道或获得方法定义的对象;
- 执行的提供者想将规范的执行“分发(hand out)”成一些可供选择的部分;
- 代码需要进行简单的组成部分。
接口在以下情况会很有用:
- 规范指定一套即将被调用的方法;
- 特别的,一个类只执行规范一次;
- 接口的调用者想通过接口类型以获得其它接口或类。
/