Delegate。。

Delegate类简介
------------------------
命名空间:System
程序集:mscorlib(在 mscorlib.dll 中)

委托(Delegate)类是一种数据结构,通过它可引用静态方法或引用类实例及该类的实例方法。
以往的界面编程中我们应该都接触过各种类型的事件驱动(event driven)的处理模式,
在这种模式里,我们定义相应事件触发的函数。
例如:
Button1 的 Click事件,我们可以编写Button1_Click 或 Btn1Clicked等函数来做相应的驱动处理。
而事件与驱动函数的对应关系就是通过委托(Delegate)类来关联的。

其实委托(Delegate)类这种数据结构有些类似于之前C/C++中的函数指针

Delegate类一个简单应用
------------------------
1.定义一个Delegate函数数据结构
2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
3.Delegate数据变量指向实例方法
4.通过Delegate数据变量执行实例方法

A very basic example (TestClass.cs):
 1 using System;
 2 
 3 namespace MySample
 4 {
 5     class TestClass
 6     {
 7     //1.定义一个Delegate函数数据结构
 8         public delegate void GoDelegate();
 9 
10         [STAThread]
11         static void Main(string[] args)
12         {
13         //3.Delegate数据变量指向实例方法
14             GoDelegate goDelegate = new GoDelegate( MyDelegateFunc);
15 
16         //4.通过Delegate数据变量执行实例方法
17             goDelegate();
18             return;
19         }
20    
21         //2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
22         public static void MyDelegateFunc()
23         {
24             Console.WriteLine("delegate function...");
25         }        
26     }
27 }
View Code
编译执行结果:

# TestClass.exe
delegate function...



使用Delegate类和Override实现多态的比较
-----------------------------------------------
1.使用Delegate类的时候,下面的例子可以很清楚的说明。
1.1 首先定义一个动物基类(MyAnimalDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。
并且在ShowAnimalType方法中调用Delegate引用的实例方法

1.2 定义狮子(LionDelegateClass)和马(HorseDelegateClass)两个子类。Delegate与各自的实例方法绑定
实现不同的属性显示(ShowAnimalType)方法。


////Delegate example (TestClass.cs):
 1 using System;
 2 namespace MySample
 3 {
 4    class TestClass
 5    {
 6       [STAThread]
 7       static void Main(string[] args)
 8       {
 9       //狮子(LionDelegateClass)的属性显示(ShowAnimalType)方法调用
10          LionDelegateClass lionDelegate = new LionDelegateClass();
11          lionDelegate.ShowAnimalType("MySample");
12 
13       //马(HorseDelegateClass)的属性显示(ShowAnimalType)方法调用
14          HorseDelegateClass horseDelegate = new HorseDelegateClass();
15          horseDelegate.ShowAnimalType("MySample");
16       }
17    }
18 
19    //动物基类(MyAnimalDelegateClass)
20    public class MyAnimalDelegateClass
21    {
22       //Delegate数据结构定义
23       public delegate void DelegateFunction(string strFuncName);
24 
25       private DelegateFunction m_delegateFunction = null;
26 
27       //Delegate类型的属性
28       public DelegateFunction delegateFunction 
29       {
30          get 
31          {
32             return m_delegateFunction;
33          } 
34          set 
35          {
36             m_delegateFunction = value;
37          }
38       }
39     
40       //属性显示(ShowAnimalType)方法
41       public void ShowAnimalType(string strFuncName)
42       {
43          if (delegateFunction != null)
44          {
45             object[] args = {strFuncName};
46          //调用Delegate引用的实例方法
47             delegateFunction.DynamicInvoke(args);
48          }
49       }
50    }
51 
52    //狮子(LionDelegateClass)
53    public class LionDelegateClass:MyAnimalDelegateClass
54    {
55       public LionDelegateClass()
56       {
57          this.delegateFunction = new DelegateFunction(subFunction1);
58       }
59 
60       //狮子(LionDelegateClass)实例方法的实装
61       private void subFunction1(string strFuncName)
62       {
63          System.Console.WriteLine(
64             string.Format("[{0}]This is a lion....", strFuncName));
65       }
66    }
67 
68    //马(HorseDelegateClass)
69    public class HorseDelegateClass:MyAnimalDelegateClass
70    {
71       public HorseDelegateClass()
72       {
73          this.delegateFunction = new DelegateFunction(subFunction2);
74       }
75 
76       //马(HorseDelegateClass)实例方法的实装
77       private void subFunction2(string strFuncName)
78       {
79          System.Console.WriteLine(
80             string.Format("[{0}]This is a horse....", strFuncName));
81       }
82    }
83 }
View Code
编译执行结果:

# TestClass.exe

[MySample]This is a lion....
[MySample]This is a horse....



2.使用Override实装的时候,参考下面的例子。
1.1 首先定义一个动物基类(AbstractAnimalNoDelegateClass), 基类中有显示属性的(ShowAnimalType)的public方法。
并且在ShowAnimalType方法中调用抽象方法(NoDelegateFunction)

1.2 定义狮子(LionNoDelegateClass)和马(HorseNoDelegateClass)两个子类。
子类中实装抽象方法(NoDelegateFunction)
实现不同的属性显示(ShowAnimalType)方法。

////Override example (TestClass.cs):
 1 using System;
 2 namespace MySample
 3 {
 4    class TestClass
 5    {
 6       [STAThread]
 7       static void Main(string[] args)
 8       {
 9           //狮子(LionNoDelegateClass )的属性显示(ShowAnimalType)方法调用
10           LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();
11        lionNoDelegate.ShowAnimalType("MySample");
12 
13           //马(HorseNoDelegateClass )的属性显示(ShowAnimalType)方法调用
14        HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();
15        horseNoDelegate.ShowAnimalType("MySample");
16       }
17    }
18 
19    //动物基类(AbstractAnimalNoDelegateClass)
20     public abstract class AbstractAnimalNoDelegateClass
21     {
22         public void ShowAnimalType(string strFuncName)
23         {
24             //抽象方法(NoDelegateFunction)调用
25             NoDelegateFunction(strFuncName);
26         }
27         //在基类中定义抽象方法(NoDelegateFunction)
28         protected abstract void NoDelegateFunction(string strFuncName);
29     }
30 
31     //狮子(LionNoDelegateClass )
32     public class LionNoDelegateClass:AbstractAnimalNoDelegateClass
33     {
34     // 子类中实装抽象方法(NoDelegateFunction)
35         protected override void NoDelegateFunction(string strFuncName)
36         {
37             System.Console.WriteLine(
38                 string.Format("[{0}]This is a lion....", strFuncName));
39         }
40     }
41     
42    //马(HorseNoDelegateClass )
43     public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass
44     {
45     // 子类中实装抽象方法(NoDelegateFunction)
46         protected override void NoDelegateFunction(string strFuncName)
47         {
48             System.Console.WriteLine(
49                 string.Format("[{0}]This is a horse....", strFuncName));
50         }
51     }
52 }
View Code

编译执行结果:

# TestClass.exe

[MySample]This is a lion....
[MySample]This is a horse....




3.比较Delegate和Override实装方式
可以看出Delegate实装方式中,相当于定义一个函数指针成员变量
通过把实装函数的地址赋给该成员变量,实现同样的方法,处理方式的不同。
而Override方式中,则是在父类中预先定义好接口,通过实装的不同,
来实现同样的方法,处理方式的不同。
Delegate实装方式比较灵活,适合设计不是很完善的场合,便于修改。
Override方式封装性好,相对比较安全。

MulticastDelegate 类的应用
---------------------------------
在C#中,委托(Delegate)类是多路委托,这就说可以同时指向多个处理函数,
并且可以按照委托的先后顺序,执行相应的函数。


如下例:
 1 using System;
 2 namespace MySample
 3 {
 4     class TestClass
 5     {
 6         [STAThread]
 7         static void Main(string[] args)
 8         {
 9             DogDelegateClass dogDelegate = new DogDelegateClass();
10             dogDelegate.ShowAnimalType("MySample");
11 
12     }
13 
14     public class MyAnimalDelegateClass
15     {
16         public delegate void DelegateFunction(string strFuncName);
17 
18         private DelegateFunction m_delegateFunction = null;
19 
20         public DelegateFunction delegateFunction 
21         {
22             get 
23             {
24                 return m_delegateFunction;
25             } 
26             set 
27             {
28                 m_delegateFunction = value;
29             }
30         }
31 
32         public void ShowAnimalType(string strFuncName)
33         {
34             if (delegateFunction != null)
35             {
36                 object[] args = {strFuncName};
37 
38                 delegateFunction.DynamicInvoke(args);
39             }
40         }
41     }
42 
43     public class DogDelegateClass:MyAnimalDelegateClass
44     {
45         public DogDelegateClass()
46         {
47       //多路委托函数 设定
48             this.delegateFunction =  new DelegateFunction(subFunction31);
49             this.delegateFunction += new DelegateFunction(subFunction32);
50         }
51   //委托函数1
52         private void subFunction31(string strFuncName)
53         {
54             System.Console.WriteLine(
55                 string.Format("[{0}]This is a dog....", strFuncName));
56         }
57   //委托函数2
58         private void subFunction32(string strFuncName)
59         {
60             System.Console.WriteLine(
61                 string.Format("[{0}]This is a nice dog....", strFuncName));
62         }
63     }
64 }
View Code

编译执行结果:

# TestClass.exe

[MySample]This is a dog....
[MySample]This is a nice dog....
posted @ 2013-09-03 01:51  streetpasser  阅读(451)  评论(0编辑  收藏  举报