C# 委托 应用实例
2024-10-09 12:48:26
用一句话解释委托:委托是一种可以把引用存储为函数的类型。
有些类似Spring框架对于接口的用法,向Action中注入Service对象。Action并不知道调用哪个服务层,只有容器通过配置文件
向Action注入Service对象后,Action才能知道调用的是哪个实现的服务层对象。
你传入的是那个实现类,我就执行哪个实现类的方法。
从网上搜得一段说明,帮助理解:
委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;
可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。
分析下面例子:首先对于一个热水器对象来说,他满足一定条件的时候需要触发一个事件(委托),但这个事件不那么确定或者不只调用一个方法。
那么我们就在这个对象中声明一个委托方法:
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate
{
// 热水器
public class Heater
{
private int temperature;
public delegate void BoilHandler(int param); //声明委托
public event BoilHandler BoilEvent; //声明事件
// 烧水
public void BoilWater()
{
for (int i = ; i <= ; i++)
{
temperature = i;
if (temperature > )
{
if (BoilEvent != null)
{ //如果有对象注册
BoilEvent(temperature); //调用所有注册对象的方法
}
}
}
}
}
}
然后,再定义处理这个事件的一些方法:
// 警报器
public class Alarm
{
public void MakeAlert(int param)
{
Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
}
}
// 显示器
public class Display
{
public static void ShowMsg(int param)
{ //静态方法
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
}
}
好了,一切准备好,我们利用注册事件,调用这些委托的方法:
class Program
{
static void Main()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.BoilEvent += alarm.MakeAlert; //注册方法
heater.BoilEvent += (new Alarm()).MakeAlert; //给匿名对象注册方法
heater.BoilEvent += Display.ShowMsg; //注册静态方法
heater.BoilWater(); //烧水,会自动调用注册过对象的方法
}
}
输出为:
Alarm:嘀嘀嘀,水已经 96 度了:
Alarm:嘀嘀嘀,水已经 96 度了:
Display:水快烧开了,当前温度:96度。
最新文章
- tomcat对请求路径的匹配过程(原创)
- C#高级编程笔记 Day 3, 2016年9月 8日 抽象类
- phpcms--模型管理,推荐位管理,类别管理
- http://www.cnblogs.com/dumuqiao/p/3654702.html?utm_source=tuicool&;utm_medium=referral
- Python顺序集合之 List
- MyBatis返回主键
- Struts2配置RESULT中TYPE的参数说明
- javascript window.confirm确认 取消对话框实现代码小结
- Mapper 动态代理方式
- 【转】iptables 命令介绍
- .net Json 反序列化时,属性带点
- Docker第二章:docker基础1--镜像,容器&;仓库
- 16-(基础入门篇)GPRS(Air202)关于多个文件中的变量调用和定时器
- python+opencv 运行环境搭建
- Android Studio项目提交(或更新)到github的方法
- java后台获取和js拼接展示信息
- python笔记04:字典
- 【刷题】BZOJ 2154 Crash的数字表格
- vrrp_script不起作用解决方案
- win2008 svn 搬迁