明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

委托

Posted on 2010-07-22 18:01  且行且思  阅读(260)  评论(0)    收藏  举报
 【词语】:委托
  【注音】:wěi tuō
  【释义】:1.亦作"委托"。 2.将自己的事务嘱托他人代为处理。 3.交结,结纳。 4.犹依托,依靠。
  (delegate)
  【定义】:委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

C++

  一种引用类型,它是 C++ 函数指针的托管版本。委托可以引用实例和静态(在 Visual Basic 中为 Shared)方法,而函数指针只能引用静态(在 Visual Basic 中为 Shared)方法。
  在C#中,委托是一种可以把引用存储为函数的类型。
  委托的声明非常类似于函数,但不带函数体,且要使用delegate关键字。
  委托的声明指定了一个函数签名,其中包含一个返回类型和参数列表。
  在定义了委托后,就可以声明该委托类型的变量。
  接着将这个变量初始化为与该委托有相同签名的函数引用。
  之后,就可以使用委托变量调用这个函数,就像 该变量是一个函数一样。

委托基本应用

  委托一般与事件配合起来一起使用,经典的用法:委托+事件=观察模式
  实现功能代码如下([1]):
  假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
  现在我们需要写个程序来模拟这个烧水的过程,我们将定义一个类来代表热水器,我们管它叫:Heater,它有代表水温的字段,叫做temperature;当然,还有必不可少的给水加热方法BoilWater(),一个发出语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。
  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 = 0; i <= 100; i++) {
  temperature = i;
  if (temperature > 95) {
  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度。
  // 省略...