问题描述

(1) 创建 C#控制台应用程序。

(2) 在程序中新建一个表示太阳的类Sun,在其中定义一个事件OnRise,一个成员方法Rise,并在方法中引发事件。参考源代码如下(太阳只有一个,所以将其定义为静态类) :

public static class Sun {public static event EventHandler OnRise;public static void Rise() {Console.WriteLine("太阳从东方升起!"); if (OnRise != null)OnRise(null, null);}}

(3) 在程序中新建一个公鸡类 Cock ,在其中定义私有字段 _name ,针对 Sun.OnRise 事件的处理方法 Sun_OnRise,事件 OnSing,以及引发该事件的方法 Sing;在类的构造函数中初始化字段,并将事件处理方法与事件相关联。

参考源代码如下(Sun_OnRise 方法中调用了 Sing 方法,表示太阳升起会使公鸡打鸣) :

    public class Cock{private string _name;public Cock(string name){_name = name;Sun.OnRise += new EventHandler(Sun_OnRise);}private void Sun_OnRise(object sender, EventArgs e){Console.WriteLine("公鸡{0}:", _name);Console.WriteLine("雄鸡一声天下白!");this.Sing();}public event EventHandler OnSing;public void Sing(){Console.WriteLine("喔喔喔……");if (OnSing != null)OnSing(this, null);}}

(4) 在程序中新建一个主人类 Host,在其中同样定义字段_name,起床事件 OnGetup ,起床方法 Getup (引发起床事件) ,养鸡方法 Foster ,以及 Cock.OnSing 事件的处理方法 c1_OnSing,并在 Foster 方法中与事件相关联。

参考源代码如下(c1_OnSing 方法中调用了 Getup 方法,表示公鸡打鸣会使主人起床) :

    public class Host{private string _name;public Host(string name) { _name = name; }public event EventHandler OnGetup;public void Getup(){Console.WriteLine("日出而作……");if (OnGetup != null)OnGetup(this, null);}public void Foster(Cock c1){c1.OnSing += new EventHandler(c1_OnSing);}private void c1_OnSing(object sender, EventArgs e){Console.WriteLine("主人{0}:", _name);Console.WriteLine("闻鸡起舞!");this.Getup();}}

(5) 参照 Cock 类和 Host 类中的代码,新建狗类 Dog 和猫类 Cat,在其中定义字段 _owner 以记录其主人对象,定义 owner_OnGetup 方法以处理 Host.OnGetup 事件(主人起床时,输出狗叫声"汪汪"和猫叫声"喵喵";)通过属性 Owner 封装字段_owner,并在其 set 访问函数中关联事件和事件处理方法。

(6) 在程序主方法中依次创建鸡、主人、狗、猫对象,而后调用 Sun.Rise 方法,参考源代码如下:

    public class Program {static void Main(){//编译运行程序,看看"太阳升起"这一事件会引发怎样的连锁反应。Cock cock1 = new Cock("花花");Host host1 = new Host("祖逖");host1.Foster(cock1);Dog dog1 = new Dog("旺财");dog1.Owner = host1;Cat cat1 = new Cat("咪咪");cat1.Owner = host1; Sun.Rise();}}

(7) 编译运行程序,看看"太阳升起"这一事件会引发怎样的连锁反应。

解决方案

using System;namespace Homework3
{/* 在程序中新建一个表示太阳的类Sun,在其中定义一个事件OnRise,一个成员方法Rise,并在方法中引发事件。* 参考源代码如下(太阳只有一个,所以将其定义为静态类) : */public static class Sun{public static event EventHandler OnRise;public static void Rise(){Console.WriteLine("太阳从东方升起!");if (OnRise != null)OnRise(null, null);}}/*在程序中新建一个公鸡类 Cock ,在其中定义私有字段 _name ,针对 Sun.OnRise 事件的处理方法 Sun_OnRise,* 事件 OnSing,以及引发该事件的方法 Sing;在类的构造函数中初始化字段,并将事件处理方法与事件相关联。* 参考源代码如下(Sun_OnRise 方法中调用了 Sing 方法,表示太阳升起会使公鸡打鸣) : */public class Cock{private string _name;public Cock(string name){_name = name;Sun.OnRise += new EventHandler(Sun_OnRise);}private void Sun_OnRise(object sender, EventArgs e){Console.WriteLine("公鸡{0}:", _name);Console.WriteLine("雄鸡一声天下白!");this.Sing();}public event EventHandler OnSing;public void Sing(){Console.WriteLine("喔喔喔……");if (OnSing != null)OnSing(this, null);}}/*在程序中新建一个主人类 Host,在其中同样定义字段_name,起床事件 OnGetup ,起床方法 Getup (引发起床事件) ,养鸡方法 Foster ,* 以及 Cock.OnSing 事件的处理方法 c1_OnSing,并在 Foster 方法中与事件相关联。* 参考源代码如下(c1_OnSing 方法中调用了 Getup 方法,表示公鸡打鸣会使主人起床) :*/public class Host{private string _name;public Host(string name) { _name = name; }public event EventHandler OnGetup;public void Getup(){Console.WriteLine("日出而作……");if (OnGetup != null)OnGetup(this, null);}public void Foster(Cock c1){c1.OnSing += new EventHandler(c1_OnSing);}private void c1_OnSing(object sender, EventArgs e){Console.WriteLine("主人{0}:", _name);Console.WriteLine("闻鸡起舞!");this.Getup();}}/*参照 Cock 类和 Host 类中的代码,新建狗类 Dog 和猫类 Cat,* 在其中定义字段 _owner 以记录其主人对象,定义 owner_OnGetup 方法以处理 Host.OnGetup 事件(主人起床时,输出狗叫声"汪汪"和猫叫声"喵喵";)* 通过属性 Owner 封装字段_owner,并在其 set 访问函数中关联事件和事件处理方法。 */public class Dog {private string _name;private Host _owner;public Dog(string name) { _name = name; }public Host Owner{set { _owner = value;value.OnGetup += new EventHandler(owner_OnGetup);}}public void owner_OnGetup(object sender, EventArgs e){Console.WriteLine("汪汪");}} public class Cat {private string _name;private Host _owner;public Cat(string name) { _name = name; }public Host Owner{set { _owner = value;value.OnGetup += new EventHandler(owner_OnGetup);}}public void owner_OnGetup(object sender, EventArgs e){Console.WriteLine("喵喵");}}/*在程序主方法中依次创建鸡、主人、狗、猫对象,而后调用 Sun.Rise 方法,参考源代码如下:*/public class Program {static void Main(){//编译运行程序,看看"太阳升起"这一事件会引发怎样的连锁反应。Cock cock1 = new Cock("花花");Host host1 = new Host("祖逖");host1.Foster(cock1);Dog dog1 = new Dog("旺财");dog1.Owner = host1;Cat cat1 = new Cat("咪咪");cat1.Owner = host1; Sun.Rise();}}}

运行结果

C#——事件(Event)DEMO[闻鸡起舞]相关推荐

  1. 实战篇 | 基于freeRTOS的多任务事件传输demo(附代码)

    之前分享了很多关于freeRTOS的知识,那么我们怎么在实战中去写代码呢?本篇文章重在对基于freeRTOS的架构代码的解析.整个功能如下图: 为什么要用freeRTOS 在实际项目中,如果程序等待一 ...

  2. C#事件(event)解析

    原文:http://www.cnblogs.com/michaelxu/archive/2008/04/02/1134217.html 事件(event),这个词儿对于初学者来说,往往总是显得有些神秘 ...

  3. python 同步 事件 event 简介

    目录 1. Event 1.1 set() 1.2 wait() 1.3 clear() 1.4 is_set() 2. 协调线程同步 3. 一个更复杂的例子 事件 Event是另一种python多线 ...

  4. 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  5. [数据库] Navicat for MySQL事件Event实现数据每日定期操作

    在我们操作数据库过程中,通常会遇到一些某个时间点操作数据库的问题,例如:         (1).每天凌晨12点对数据库进行定时备份,结算和汇总:         (2).每天凌晨2点删除数据库前三天 ...

  6. C#总结(二)事件Event 介绍总结

    最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...

  7. 线程queue、事件event及协程

    线程queue.事件event及协程 线程queue 多线程抢占资源,让其保持串行的两种方式: ​ 1.互斥锁 ​ 2.队列 线程队列分为以下三种: 1.Queue(先进先出) import queu ...

  8. 事件EVENT,WaitForSingleObject(),WaitForMultipleObjecct()和SignalObjectAndWait() 的使用(上)

    用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法.但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力.这时,只能考虑使 ...

  9. Python 线程事件 Event - Python零基础入门教程

    目录 一.Python 线程事件 Event 函数介绍 二.Python 线程事件 Event 原理 三.Python 线程事件 Event 使用 四.重点总结 五.猜你喜欢 零基础 Python 学 ...

  10. 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别

    Mutex与Event控制互斥事件的使用详解最近写一程序,误用了Mutex的功能,错把Mutex当Event用了.[Mutex]使用Mutex的主要函数:CreateMutex.ReleaseMute ...

最新文章

  1. JAVA 计算String类型的时间差(秒)
  2. Tomcat tomcat-users.xml详解
  3. 计算字符在字符串是出现的次数
  4. devserver配置_03-零基础学webpack4.0之html相关配置
  5. SAP Spartacus Cart UI 修改 quantity 字段后的 Patch 请求遇到 400 错误 - IllegalArgumentError
  6. thinkphp四种url访问方式详解
  7. Leetcode--152. 乘积最大子序列
  8. c++rpg黑框游戏_NO总本色出演断智大师兄,电竞魔音主C人《超级猎杀》一战成名...
  9. 那信息闭塞的地方 飞秋官方下载
  10. DataTable数据转成Json格式
  11. APACHE ACTIVEMQ安装
  12. 一、Spring Boot整合redies
  13. 100个句子直刷7000单词
  14. 软件测试与软件质量模型
  15. 简单排查java应用CPU飙高的线程问题
  16. python代码审查规则_python代码检查
  17. 进程理论以及开启子进程的两种方式
  18. TensorFlow学习笔记(一)---graph,op,tensor,Session,Variables,Tensorboard
  19. 域格4G模块TTS语音使用方法
  20. 计算机键盘无线遥控器实现方法,利用红外遥控器实现单片机键盘无线式操作

热门文章

  1. 【Vegas原创】使用GreenAMP时,提示“无法载入mysql扩展”解决方法
  2. java eclipse 内存_java – Eclipse 3.5.1使用大量内存
  3. kmeans中的k的含义_聚类的Python实现(二):确定分群数K
  4. SpringMVC_3.请求映射与静态资源处理
  5. java向另一activity输入_Android中调用另一个Activity并返回结果-以模拟选择头像功能为例...
  6. java中递归的概念_【Java】基础38:什么叫递归?
  7. mysql 重启失败,重启MySQL服务失败
  8. 八十四、Python | Leetcode回溯算法系列
  9. GPLinker:基于GlobalPointer的事件联合抽取
  10. 从4篇最新论文详解NLP新范式——Continuous Prompt