C# Deldegate的使用
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):
- using System;
- namespace MySample
- {
- class TestClass
- {
- //1.定义一个Delegate函数数据结构
- public delegate void GoDelegate();
- [STAThread]
- static void Main(string[] args)
- {
- //3.Delegate数据变量指向实例方法
- GoDelegate goDelegate = new GoDelegate( MyDelegateFunc);
- //4.通过Delegate数据变量执行实例方法
- goDelegate();
- return;
- }
- //2.定义Delegate将引用的静态方法或引用类实例及该类的实例方法
- public static void MyDelegateFunc()
- {
- Console.WriteLine("delegate function...");
- }
- }
- }
- 编译执行结果:
- # 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):
- using System;
- namespace MySample
- {
- class TestClass
- {
- [STAThread]
- static void Main(string[] args)
- {
- //狮子(LionDelegateClass)的属性显示(ShowAnimalType)方法调用
- LionDelegateClass lionDelegate = new LionDelegateClass();
- lionDelegate.ShowAnimalType("MySample");
- //马(HorseDelegateClass)的属性显示(ShowAnimalType)方法调用
- HorseDelegateClass horseDelegate = new HorseDelegateClass();
- horseDelegate.ShowAnimalType("MySample");
- }
- }
- //动物基类(MyAnimalDelegateClass)
- public class MyAnimalDelegateClass
- {
- //Delegate数据结构定义
- public delegate void DelegateFunction(string strFuncName);
- private DelegateFunction m_delegateFunction = null;
- //Delegate类型的属性
- public DelegateFunction delegateFunction
- {
- get
- {
- return m_delegateFunction;
- }
- set
- {
- m_delegateFunction = value;
- }
- }
- //属性显示(ShowAnimalType)方法
- public void ShowAnimalType(string strFuncName)
- {
- if (delegateFunction != null)
- {
- object[] args = {strFuncName};
- //调用Delegate引用的实例方法
- delegateFunction.DynamicInvoke(args);
- }
- }
- }
- //狮子(LionDelegateClass)
- public class LionDelegateClass:MyAnimalDelegateClass
- {
- public LionDelegateClass()
- {
- this.delegateFunction = new DelegateFunction(subFunction1);
- }
- //狮子(LionDelegateClass)实例方法的实装
- private void subFunction1(string strFuncName)
- {
- System.Console.WriteLine(
- string.Format("[{0}]This is a lion....", strFuncName));
- }
- }
- //马(HorseDelegateClass)
- public class HorseDelegateClass:MyAnimalDelegateClass
- {
- public HorseDelegateClass()
- {
- this.delegateFunction = new DelegateFunction(subFunction2);
- }
- //马(HorseDelegateClass)实例方法的实装
- private void subFunction2(string strFuncName)
- {
- System.Console.WriteLine(
- string.Format("[{0}]This is a horse....", strFuncName));
- }
- }
- }
- 编译执行结果:
- # 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):
- using System;
- namespace MySample
- {
- class TestClass
- {
- [STAThread]
- static void Main(string[] args)
- {
- //狮子(LionNoDelegateClass )的属性显示(ShowAnimalType)方法调用
- LionNoDelegateClass lionNoDelegate = new LionNoDelegateClass();
- lionNoDelegate.ShowAnimalType("MySample");
- //马(HorseNoDelegateClass )的属性显示(ShowAnimalType)方法调用
- HorseNoDelegateClass horseNoDelegate = new HorseNoDelegateClass();
- horseNoDelegate.ShowAnimalType("MySample");
- }
- }
- //动物基类(AbstractAnimalNoDelegateClass)
- public abstract class AbstractAnimalNoDelegateClass
- {
- public void ShowAnimalType(string strFuncName)
- {
- //抽象方法(NoDelegateFunction)调用
- NoDelegateFunction(strFuncName);
- }
- //在基类中定义抽象方法(NoDelegateFunction)
- protected abstract void NoDelegateFunction(string strFuncName);
- }
- //狮子(LionNoDelegateClass )
- public class LionNoDelegateClass:AbstractAnimalNoDelegateClass
- {
- // 子类中实装抽象方法(NoDelegateFunction)
- protected override void NoDelegateFunction(string strFuncName)
- {
- System.Console.WriteLine(
- string.Format("[{0}]This is a lion....", strFuncName));
- }
- }
- //马(HorseNoDelegateClass )
- public class HorseNoDelegateClass:AbstractAnimalNoDelegateClass
- {
- // 子类中实装抽象方法(NoDelegateFunction)
- protected override void NoDelegateFunction(string strFuncName)
- {
- System.Console.WriteLine(
- string.Format("[{0}]This is a horse....", strFuncName));
- }
- }
- }
- 编译执行结果:
- # TestClass.exe
- [MySample]This is a lion....
- [MySample]This is a horse....
3.比较Delegate和Override实装方式
可以看出Delegate实装方式中,相当于定义一个函数指针的成员变量。
通过把实装函数的地址赋给该成员变量,实现同样的方法,处理方式的不同。
而Override方式中,则是在父类中预先定义好接口,通过实装的不同,
来实现同样的方法,处理方式的不同。
Delegate实装方式比较灵活,适合设计不是很完善的场合,便于修改。
Override方式封装性好,相对比较安全。
MulticastDelegate 类的应用
---------------------------------
在C#中,委托(Delegate)类是多路委托,这就说可以同时指向多个处理函数,
并且可以按照委托的先后顺序,执行相应的函数。
如下例:
- using System;
- namespace MySample
- {
- class TestClass
- {
- [STAThread]
- static void Main(string[] args)
- {
- DogDelegateClass dogDelegate = new DogDelegateClass();
- dogDelegate.ShowAnimalType("MySample");
- }
- public class MyAnimalDelegateClass
- {
- public delegate void DelegateFunction(string strFuncName);
- private DelegateFunction m_delegateFunction = null;
- public DelegateFunction delegateFunction
- {
- get
- {
- return m_delegateFunction;
- }
- set
- {
- m_delegateFunction = value;
- }
- }
- public void ShowAnimalType(string strFuncName)
- {
- if (delegateFunction != null)
- {
- object[] args = {strFuncName};
- delegateFunction.DynamicInvoke(args);
- }
- }
- }
- public class DogDelegateClass:MyAnimalDelegateClass
- {
- public DogDelegateClass()
- {
- //多路委托函数 设定
- this.delegateFunction = new DelegateFunction(subFunction31);
- this.delegateFunction += new DelegateFunction(subFunction32);
- }
- //委托函数1
- private void subFunction31(string strFuncName)
- {
- System.Console.WriteLine(
- string.Format("[{0}]This is a dog....", strFuncName));
- }
- //委托函数2
- private void subFunction32(string strFuncName)
- {
- System.Console.WriteLine(
- string.Format("[{0}]This is a nice dog....", strFuncName));
- }
- }
- }
- 编译执行结果:
- # TestClass.exe
- [MySample]This is a dog....
- [MySample]This is a nice dog....
转载请表明出处!
C# Deldegate的使用的更多相关文章
随机推荐
- (转)Unity原厂讲师大解密
本文转载自:http://nedwu13.blogspot.tw/2013_11_01_archive.html Asset Bundle工作流程及人物換裝實例 - 劉剛 Unity內部的資源有兩 ...
- [Spring boot] Autowired by name, by @Primary or by @Qualifier
In the example we have currently: @Component public class BinarySearchImpl { @Autowired private Sort ...
- 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp
配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...
- ionic3+angular5页面间传递参数
一.从一个页面跳转到另一个页面的方法 1.引入服务 import { NavController } from 'ionic-angular'; 2.初始化 constructor(public na ...
- Array、ArrayList、List、IEnumerable、for、foreach应用
一.Array 类 (System) 声明数组(本身也是一种变量,要先声明再使用) 1.声明数组的语法,数组大小由长度绝定: 数据类型 [] 数组名: 如: string[] student; //字 ...
- Hierarchical query-层次查询之START WITH CONNECT BY用法
Hierarchical query-层次查询中start with...connect by prior子句用法: connect by 是结构化查询中用到的,其基本语法是: select ... ...
- 使用Spring框架入门三:基于XML配置的AOP的使用
一.引入Jar包 <!--测试1使用--> <dependency> <groupId>org.springframework</groupId> &l ...
- GitHub如何下载clone指定的tag
如上图,我想下载Tags标签为solution-4 的代码,如何处理呢? 命令如下: git clone --branch solution-4 git@github.com:zspo/learngi ...
- Webwork【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- Linux下通用打印系统CUPS使用教程
昨天研究了一下关于在Linux下实现打印操作的相关内容,整理记录如下: 1.什么是CUPS CUPS(Common UNIX Printing System,即通用Unix打印系统)是FedoraCo ...