zoukankan      html  css  js  c++  java
  • 沿“委托”而上溯到“NET事件模型”来自王涛《你必须知道的.NET》

    委托链有一个特性: 就是所有加入的委托, 都会在激活时按照加入的次序被执行.

    下面看用委托实现的NET事件模型

    public class Calculator
    {
        //定义计算器事件CalculateEventArgs
      public class CalculateEventArgs:EventArgs
      {
        //只读数据变量
        public readonly Int32 x, y;
        //构造函数-在这里输入数据变量
        public CalculateEventArgs(Int32 x,Int32 y)
        {
          this.x=x;
          this.y=y;
        }
      }

      //声明事件委托,名称为CalculateEventHandler
      //注意前面没有说,多播的委托多数需要返回值是void
      public delegate void CalculateEventHandler(object Sender, CalculateEventArgs e);

      //这是计算器类的事件字段,用于外部绑定
      public event CalculateEventHandler MyCalculate;

      //提供一个受保护的虚拟方法,子类可以覆盖它,以便·进行拒绝监视等操作
      protected virtual void OnCalculate(CalculateEventArgs e)//注意其参数的写法
      {
        if (MyCalculate!=null)
        {
          MyCalculate(this,e);//参数就是为了能正常调用委托类型变量的
        }
      }

      //进行计算-调用这个方法表示有新的计算发生了
      public void Calculate(Int32 x, Int32 y)
      {
        CalculateEventArgs e=new CalculateEventArgs(x,y);

        OnCalculate(e);//还记得委托链吗?能按次序通知所有事件的注册者
      }
    }

    //定义一个消息触发器-触发消息用的
    public class CalculatorManager
    {
      //消息通知方法1,定义跟Calculator.CalculateEventArgs一样
      public void Add(object Sender,Calculator.CalculateEventArgs e)
      {
        System.Windows.Forms.MessageBox.Show("加法结果:" + (e.x + e.y));
      }
      //消息通知方法2,定义跟Calculator.CalculateEventArgs一样
      public void Subtract(object Sender, Calculator.CalculateEventArgs e)
      {
        System.Windows.Forms.MessageBox.Show("减法结果:" + (e.x - e.y));
      }
    }

    ...调用代码

    private void button4_Click(object sender, EventArgs e)
    {
      //定义计算器对象
      Calculator cal = new Calculator();
      //定义计算器事件触发器对象
      CalculatorManager cm = new CalculatorManager();

      //事件绑定
      cal.MyCalculate += cm.Add;//注意不能有括号
      cal.MyCalculate += cm.Subtract;

      //事件激活---------------------
      //先准备数据
      int x = Convert.ToInt32(textBox1.Text);
      int y = Convert.ToInt32(textBox2.Text);
      cal.Calculate(x,y);
      //-----------------------------
      //这其实也是用委托实现的观察者模式
      //cal.MyCalculate += cm.Add;-------->这里也就是在增加(或者叫注册)观察者
      //通过cal.Calculate(x,y);激活观察事件通知,由于委托链的特性,使得
      //在委托链之中的观察者(就是你绑定的事件cal.MyCalculate += cm.Subtract;)
      //都能得到通知
    }


    ...
  • 相关阅读:
    安卓开发环境搭建之最新版(So Easy!)
    SQL 命令中英文对照表
    C#,往线程里传参数的方法总结(转)
    javascript清空网页代码防止查看源代码
    DNN 数据访问策略 (转)
    Windows Media Services 流媒体服务器架设教程(转)
    winform 导入导出EXCEL(更新)
    SQL 批量插入、修改、删除
    META标签的一些作用 (转到翱翔雄鹰)
    js获取 request值
  • 原文地址:https://www.cnblogs.com/lizunicon/p/1167680.html
Copyright © 2011-2022 走看看