委托和事件:第 3 页 事件的由来

原文发布时间为:2008-11-01 —— 来源于本人的百度文章 [由搬家工具导入]

事件的由来

我们继续思考上面的程序:上面的三个方法都定义在Programe类中,这样做是为了理解的方便,实际应用中,通常都是 GreetPeople 在一个类中,ChineseGreeting和 EnglishGreeting 在另外的类中。现在你已经对委托有了初步了解,是时候对上面的例子做个改进了。假设我们将GreetingPeople()放在一个叫GreetingManager的类中,那么新程序应该是这个样子的:

namespace Delegate {
       //定义委托,它定义了可以代表的方法的类型
       public delegate void GreetingDelegate(string name);
      
       //新建的GreetingManager类
       public class GreetingManager{
              public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
                     MakeGreeting(name);
              }
              }

       class Program {
              private static void EnglishGreeting(string name) {
                     Console.WriteLine("Morning, " + name);
              }

              private static void ChineseGreeting(string name) {
                     Console.WriteLine("早上好, " + name);
              }

              static void Main(string[] args) {
                     // ... ...
              }
       }
}

这个时候,如果要实现前面演示的输出效果,Main方法我想应该是这样的:

static void Main(string[] args) {
       GreetingManager gm = new GreetingManager();
       gm.GreetPeople("Jimmy Zhang", EnglishGreeting);
       gm.GreetPeople("张子阳", ChineseGreeting);
}

我们运行这段代码,嗯,没有任何问题。程序一如预料地那样输出了:
Morning, Jimmy Zhang
早上好, 张子阳

现在,假设我们需要使用上一节学到的知识,将多个方法绑定到同一个委托变量,该如何做呢?让我们再次改写代码:

输出:
Morning, Jimmy Zhang
早上好, Jimmy Zhang

到了这里,我们不禁想到:面向对象设计,讲究的是对象的封装,既然可以声明委托类型的变量(在上例中是delegate1),我们何不将这个变量封装到 GreetManager类中?在这个类的客户端中使用不是更方便么?于是,我们改写GreetManager类,像这样:

现在,我们可以这样使用这个委托变量:

尽管这样达到了我们要的效果,但是似乎并不美气,光是第一个方法注册用“=”,第二个用“+=”就让人觉得别扭。此时,轮到Event出场了,C# 中可以使用事件来专门完成这项工作,我们改写GreetingManager类,它变成了这个样子:

很容易注意到:MakeGreet 事件的声明与之前委托变量delegate1的声明唯一的区别是多了一个event关键字。看到这里,你差不多明白到:事件其实没什么不好理解的,声明一个事件不过类似于声明一个委托类型的变量而已

我们想当然地改写Main方法:

这次,你会得到编译错误:事件“Delegate.GreetingManager.MakeGreet”只能出现在 += 或 -= 的左边(从类型“Delegate.GreetingManager”中使用时除外)。

static void Main(string[] args) {
       GreetingManager gm = new GreetingManager();
       gm.MakeGreet = EnglishGreeting; // 编译错误1
       gm.MakeGreet += ChineseGreeting;

       gm.GreetPeople("Jimmy Zhang", gm.MakeGreet); //编译错误2
}

public class GreetingManager{
       //这一次我们在这里声明一个事件
       public event GreetingDelegate MakeGreet;

public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
              MakeGreeting(name);
       }
}

static void Main(string[] args) {
       GreetingManager gm = new GreetingManager();
       gm.delegate1 = EnglishGreeting;
       gm.delegate1 += ChineseGreeting;

       gm.GreetPeople("Jimmy Zhang", gm.delegate1);
}

public class GreetingManager{
//在GreetingManager类的内部声明delegate1变量
       public GreetingDelegate delegate1;      

public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
                     MakeGreeting(name);
       }
}

static void Main(string[] args) {
       GreetingManager gm = new GreetingManager();
       GreetingDelegate delegate1;
       delegate1 = EnglishGreeting;
       delegate1 += ChineseGreeting;

       gm.GreetPeople("Jimmy Zhang", delegate1);
}

时间: 2024-09-20 01:55:46

委托和事件:第 3 页 事件的由来的相关文章

jquery生成元素注册事件无效,及事件委托的使用

在页面加载完成之后,我们在页面操作用js生成html代码到页面,动态的添加元素带页面上 但是,这里可能很多人就必须碰到的一个问题就出现了,当你之后动态添加了元素到页面上,发现这个元素的绑定事件无效,如click点击了根本没有作用 这里就要用到事件委托让未来元素能绑定事件 方法一 $("div").delegate("#id", "click", function(){ ...............}); 这样做就能保证你未来生成的元素也能绑定单

JS 事件绑定、事件监听、事件委托详细介绍

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件

整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的DOM事件流.都是流的一种生动体现.用术语说流是对输入输出设备的抽象.以程序的角度说,流是具有方向的数据. 事件流分事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其

JS 中的事件绑定、事件监听、事件委托

事件绑定 要想让 JavaScript 对用户的操作作出响应,首先要对 DOM 元素绑定事件处理函数.所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称. 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数. 在DOM中直接绑定事件 我们可以在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.onkeyd

javascript事件监听与事件委托

事件监听与事件委托 在js中,常用到element.addEventListener()来进行事件的监听.但是当页面中存在大量需要绑定事件的元素时,这种方式可能会带来性能影响.此时,我们可以用事件委托的方式来进行事件的监听. 每个事件都经历三个阶段 捕获 到达目标 冒泡 事件委托需要用到事件的冒泡,冒泡就是事件发生时,上层会一层一层的接收这个事件. 如下页面结构: <body> <div id="div1"> <div id="div2"

事件冒泡与捕获&amp;事件委托

设想这样一种情况 一个div里面有个span元素  ,当鼠标单击span时,这个事件算是谁的? div还是span? 准确的说两个都触发了,这种认可大家都同意,事实就是这样的, 第二个问题来了,这个事件应该有个先后顺序 ,先触发span还是div? 早期就有两个主流的浏览器厂商各执己见,IE认为,这个事件首先触发span,然后依次往父节点传递,最终传递到document,(这个过程称为冒泡) 网景浏览器认为,任何事件都首先触发document,然后依次往下传递到span元素,(这个过程称为捕获)

事件和委托(Event vs. Delegate)-事件阉割版的Delegate

引言 关于事件和委托的文章看过很多,但总是记不完整.尤其是在给别人讲解的时候总是很零碎,所以在此整理一下,也供大家参考,很请大家不吝赐教. 本文从一个子类如何触发基类的事件(Event),引出事件和委托的共性和区别.再简单分析下背后原因,深层原因也给大家提供了部分参考资料.欢迎大家留言讨论.   问题 "如果我想在子类里触发父类的事件(Event)应该如何实现?"(可以先自己做下或者想下,再继续看您的做法是否也曾有我碰到技术误区)   问题分解为两步: 父类定义了一个事件(Event)

委托和事件 (2) - 事件

事件的由来 上文说到委托的安全性不佳,于是我们要将委托本身私有化,但还要暴露若干方法让外界使用.其中最重要的必然就是为委托挂接方法和调用委托,以便间接地调用委托所代表方法.那么事件event关键字就是c#提供给我们的一个语法糖.他并没有任何新的东西,只是减少了一些代码.所以,事件是一种特殊的委托,其特征有: 1 和一个(基底)委托类型合作,当声明了一个具有该基底委托类型的事件之后,用户在外部就可以为这个事件挂接方法,其方法类型必须和基底委托类型相同 2 可以将事件视为委托的方法链,使用event

JavaScript事件委托原理及Jquery中的事件委托

概念 事件委托,通俗来说就是将元素的事件委托给它的父级或者更外级元素处理. 事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡:事件开始由最具体的元素接收,然后逐级向上传播到较为不具体的节点(或文档). 事件捕获:事件开始由不太具体的节点接收,然后逐级向下传播到最具体的节点.它与事件冒泡是个相反的过程. DOM2级事件规定的事件流包括三个阶段: 事件捕获 目标阶段 事件冒泡 原理 事件委托就是利用事件冒泡机制实现的. 假设有一个列表,要求点击列表项弹出对应字段. <ul id="my

js事件流之事件冒泡的应用----事件委托

什么是事件委托? 它还有一个名字叫事件代理. JavaScript高级程序设计上讲: 事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件. 用取快递来解释这个现象,大家认真领会一下事件委托到底是一个什么原理: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM代为签收.现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递).前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚