C# 事件与委托

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication
 8 {
 9     class Program
10     {
11         static void Main(string[] args) //客户端
12         {
13             Heater t = new Heater(); //初始化Heater类的实例
14             t.Boiled += new BoiledEventHandler(new Monitor().Display);//在监视对象(热水器)中为观察者(显示器)实例方法事件的注册
15             t.BoilingWater();//Heater类实例对Boiled事件的触发,以便更新观察者(显示器)中的数据
16             Console.ReadKey();
17         }
18     }
19 
20     class BoiledEventArgs : EventArgs //事件类,存储观察者对监视对象(热水器)所感兴趣的字段(如Temperature)
21     {
22         public readonly int Tempurature;
23         public BoiledEventArgs(int tempurature)
24         {
25             Tempurature = tempurature;
26         }
27     }
28     delegate void BoiledEventHandler(object sender,BoiledEventArgs e); //定义一个委托
29     class Heater //监视对象(热水器)
30     {
31         int _Temperature;//令观察者(显示器)感兴趣的字段:温度
32         public string Brand = "Midea";
33         public event BoiledEventHandler Boiled;//事件委托:观察者(显示器)对监视对象(热水器)所调用的方法
34         protected virtual void OnBoiled(BoiledEventArgs e)
35         {
36             if (Boiled != null)
37             {
38                 Boiled(this, e);//事件绑定:如客户端(一般指Main函数)已有观察者(显示器)对监视对象(热水器)的事件(Boiled)进行订阅,
39                                 //则进行对观察者(显示器)数据(Temperature:温度)的更新显示
40             }
41         }
42 
43         public void BoilingWater()
44         {
45             for (int i = 0; i <= 100; i++)
46             {
47                 _Temperature= i;
48                 if (i > 90)
49                 {
50                     BoiledEventArgs e = new BoiledEventArgs(_Temperature);//事件类的构造函数,传递观察者(显示器)所感兴趣的字段(温度)
51                     OnBoiled(e);//对Boiled事件进行触发,以便使观察者(显示器)数据(Temperature:温度)得到更新
52                 }
53             }
54         }
55     }
56 
57     class Monitor //观察者(显示器)
58     {
59         public void Display(object sender, BoiledEventArgs e)
60         {
61             Heater t = (Heater)sender;//sender,来自Heater类,可以对实例的字段等进行访问,
62             Console.WriteLine("Brand is " + t.Brand);//如访问该热水器的品牌
63             Console.WriteLine("Current temperature is " + e.Tempurature);//观察者(显示器)本身数据的更新显示
64         }
65     }
66 }

参考来自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

Flash/Flex学习笔记(42):坐标旋转

坐标旋转是个啥概念呢? ? 如上图,(蓝色)小球 绕某一中心点旋转a角度后,到达(红色)小球的位置,则红色小球相对中心点的坐标为: x1 = dx * cos(...

1919
来自专栏跟着阿笨一起玩NET

DataGridView输出或保存为Excel文件(支持超过65536行多Sheet输出)

341
来自专栏wym

俄罗斯方块

//*********************************************// //**************  头文件  *****...

541
来自专栏流媒体

Activity启动流程源码分析

launcher就是android桌面应用程序。也是操作系统启动有第一个app。同时作为其他app的入口。我们找到其源码 android-6.0.0_r1\p...

871
来自专栏跟着阿笨一起玩NET

ExRichTextEdit.

本文转载:http://www.csframework.com/archive/2/arc-2-20110830-1816.htm

301
来自专栏雪胖纸的玩蛇日常

炫丽的倒计时效果Canvas绘图与动画基础

1282
来自专栏计算机编程

点击显示更多文本自定义控件

写在前面的话: 在正常项目流程中,我们很多情况下会碰到点击显示更多文本,这样可以利于页面变化加载,点击显示更多可能会非常常用,现在博主利用自己的闲暇时间来一点一...

773
来自专栏张善友的专栏

Div Scroll Bar (用层模拟滚动条)

对Div的盒模型以及Css控制定位都不熟,所以遇到了不少BT问题……好在最终突破了种种困难,基本实现了自己想要的效果。 说明: 最大的突破是通过了 xhtml...

18510
来自专栏10km的专栏

jface databinding:使用CheckboxTableViewer实现表中(Set)对象与CheckTable中选中条目数据绑定

上一篇博文《jface databinding:可多选的widget List组件selection项目与java.util.List对象的双向数据绑定》讲述了...

26910
来自专栏刘望舒

Android深入四大组件(六)Android8.0 根Activity启动过程(前篇)

前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程这篇文章,它是基于Android 7.0的,当我开始阅读Android 8.0源码时发现应...

2497

扫码关注云+社区