博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delegate。。
阅读量:7012 次
发布时间:2019-06-28

本文共 8270 字,大约阅读时间需要 27 分钟。

Delegate类简介 ------------------------      命名空间:System 程序集:mscorlib(在 mscorlib.dll 中)    委托(Delegate)类是一种数据结构,通过它可引用或引用类实例及该类的实例方法。 以往的界面编程中我们应该都接触过各种类型的(event driven)的处理模式, 在这种模式里,我们定义相应事件触发的函数。 例如: Button1 的 Click事件,我们可以编写Button1_Click 或 Btn1Clicked等函数来做相应的驱动处理。 而事件与驱动函数的对应关系就是通过委托(Delegate)类来关联的。 其实委托(Delegate)类这种数据结构有些类似于之前++中的。 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 MyAnimalDelegateClass21    {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:MyAnimalDelegateClass54    {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:MyAnimalDelegateClass70    {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 AbstractAnimalNoDelegateClass21     {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:AbstractAnimalNoDelegateClass33     {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:AbstractAnimalNoDelegateClass44     {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 MyAnimalDelegateClass15     {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:MyAnimalDelegateClass44     {45         public DogDelegateClass()46         {47       //多路委托函数 设定48             this.delegateFunction =  new DelegateFunction(subFunction31);49             this.delegateFunction += new DelegateFunction(subFunction32);50         }51   //委托函数152         private void subFunction31(string strFuncName)53         {54             System.Console.WriteLine(55                 string.Format("[{0}]This is a dog....", strFuncName));56         }57   //委托函数258         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....

转载于:https://www.cnblogs.com/streetpasser/p/3297940.html

你可能感兴趣的文章
两个JS控件-List和Pager
查看>>
pipenv虚拟环境
查看>>
使用RestSharp 库调用Restful Service
查看>>
TCP学习之三:客户端、服务端同步传输字符串
查看>>
删除Exchange Server IIS 15天日志
查看>>
MyBatis框架(4)全局文件
查看>>
【配置映射】—Entity Framework实例详解
查看>>
正则表达式
查看>>
手机端H5点击类目自动定位到相应内容
查看>>
agc032
查看>>
WCF 第二章 契约 实现一个双向契约的服务端部分
查看>>
我的Java开发学习之旅------>Java经典排序算法之快速排序
查看>>
我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计
查看>>
Docker监控怎么做?
查看>>
tps 和 qps的区别
查看>>
OAF_开发系列17_实现OAF数组应用Vector / Hashmap / Hashtable / Arraylist(案例)
查看>>
与继承相关的一些重构(二)
查看>>
22 UI_布局之线性布局-动态生成与LayoutInflater
查看>>
关于三元运算符的一个问题
查看>>
11.04T1 枚举
查看>>