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 }
编译执行结果:
# 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 }
编译执行结果:
# 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 }
编译执行结果:
# 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 }
编译执行结果:
# TestClass.exe
[MySample]This is a dog....
[MySample]This is a nice dog....