zoukankan      html  css  js  c++  java
  • 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....
  • 相关阅读:
    一道亲戚的生物学改题
    【水】强化16题解
    【我为标程写注释】最大值最小化
    【我为标程写注释】卢斯进制
    oracle 解锁表
    Oracle存储过程根据指定日期返回(N个)工作日的时间
    NPOI_2.1.3_学习记录(6)-Excel中设置小数、百分比、货币、日期、科学计数法和金额大写
    NPOI_2.1.3_学习记录(5)-创建Excel的页眉页脚
    NPOI_2.1.3_学习记录(4)-Excel中单元格的复制
    NPOI_2.1.3_学习记录(2)-在Excel中创建工作表(Sheet)
  • 原文地址:https://www.cnblogs.com/streetpasser/p/3297940.html
Copyright © 2011-2022 走看看