目的:

模拟一个家庭日常发生的场景:妈妈做好饭,说:“开饭了!”,这是爸爸听到了妈妈的喊话就立马动身开始饭吃。而儿子此时正在打游戏,于是他就说:“等我打完这把游戏再吃!”。

借由次例子来展示C#的事件,加深对它的理解与运用。

一、新建3个对象:分别是Dad,Mom,Son;

Mom class有一个带名称的构造函数,一个“喊吃饭”的事件(用来给其他对象订阅),一个“做饭”的方法;

(1)Mom class

 class Mom
{
public string Name { get; private set; } public event Action CallEat;//定义CallEat事件,发布吃饭的消息 public Mom(string name)
{
this.Name = name;
}
public void Cook()
{
Console.WriteLine( "{0}说:饭做好了,开饭啦!", this.Name);
CallEat?.Invoke();//问号表示,如果CallEat为null,则不执行。
}
}

(2)Dad class

 class Dad
{
public Dad(string name)
{
this.Name = name;
}
public string Name { get; private set; } public void Eat()
{
Console.WriteLine(this.Name+"说:吃饭喽!");
}
}

(3)Son class

class Son
{
public Son(string name)
{
this.Name = name;
}
public string Name { get; private set; } public void Eat()
{
Console.WriteLine(this.Name+"说:等我打完这把游戏再吃!");
}
}

好了,现在3个对象的模版(蓝图)也就是类已经开发完成;我们来看看他们在IDE里的样子:

妈妈:爸爸:儿子:

二、实例化对象、指定订阅关系、编写场景剧本。

实例化3个对象:使用构造函数(说明:当你开发了一个类的构造函数以后,默认构造函数将不可再使用了)

            Mom mom = new Mom("小新妈妈");
Dad dad = new Dad("小新爸爸");
Son son = new Son("儿子小新");

订阅事件:

爸爸用吃饭这个事件处理器来订阅了妈妈的一个事件CallEat,代码如下:

同理,儿子也用吃饭这个事件处理器来订阅了妈妈的CallEat事件,代码如下:

            mom.CallEat += son.Eat;

三、编写业务逻辑:

接下来任何时候,只要妈妈的Cook()发生,爸爸和儿子就会发生响应的响应;业务逻辑完整代码:

            mom.CallEat += dad.Eat;
mom.CallEat += son.Eat; mom.Cook();//妈妈的做饭事情发生,做饭好了它会发布通知,订阅了此通知的用户便会通过Invoke执行响应各自的方法

执行的结果如下:

类、事件与对象---Dad&Mom简单练习的更多相关文章

  1. 《纵向切入ASP.NET 3.5控件和组件开发技术》笔记:高效率事件集合对象

    在之前讲的几个例子中,使用的是最普通的定义事件方法,比如KingTextBox中事件是这样定义的:/// <summary>/// 获得本书更多内容,请看:/// http://blog. ...

  2. vue-阻止事件冒泡-开启右键-键盘类事件

    一: 阻止事件冒泡 布局: 当点击按钮时,会触发button的click 也会触发父级的方法 <div id="box"> <div @click="p ...

  3. java匿名类和匿名对象及this的其他用法

    /* 匿名内部类:就是内部类的简写格式. 必须前提:内部类必须继承或者实现一个类或者接口. 匿名内部类其实就是一个匿名 子类对象. 格式:new 父类对象 or 接口(){ 子类内容:(覆盖父类的, ...

  4. CSS 伪类和伪对象选(五)

    一.伪选择器 伪选择器包括:伪类选择器和伪对象选择器,以冒号(:)作为前缀,冒号后紧跟伪类或者伪对象名称,冒号前后没有空格,否则解析为包含选择器 如: div:hover{ font-size:12p ...

  5. Python类,域,方法,对象,继承

    类和对象: 是面向对象编程的两个主要方面,类创建一个新类型,而对象这个类的实例.. 域: 属于一个对象或类的变量被称为域.域有两种类型: 属于每个实例(类的对象)或属于类本身.它们分别被称为实例变量和 ...

  6. 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化

    1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...

  7. 从零开始学 Web 之 jQuery(七)事件冒泡,事件参数对象,链式编程原理

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  8. C# 有关控件、自定义类事件中的委托链的获取、移除操作

    直接来代码吧,这样干脆直接,也不耽误我午休了.一切尽在源码中. public class ControlEventTool { /// <summary> /// 移除控件的某类事件, 如 ...

  9. 利用JavaScriptSerializer类 进行Json对象的序列化和反序列化和过滤

    项目下载:JavaScriptSerializer_对JSON对象序列化与反序列化及过滤器 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化 1. 首 ...

  10. pyglet模块的EventDispatcher(事件派发对象)

    事件派发对象用于处理事件的派发与响应,pyglet的window对象正是继承了它才具有处理事件的能力. 步骤: 1.注册事件类型: EventDispatcher.register_event_typ ...

随机推荐

  1. linux分区规划

    一般来说,对系统进行分区,需要提前规划好: ​ 系统分区:如果资源允许的话,建议300G(该分区只存放操作系统和一些配置文件等): ​ /boot分区:是引导分区(该分区损坏,系统就启动不了了),在b ...

  2. QtCreator 跨平台开发添加动态库教程(以OpenCV库举例)- Windows篇

      Qt具有跨平台的特性,即Qt数据结构与算法库本身跨平台和编译脚本(.pro)跨平台.在同时具有Windows下和Linux开发的需求时,最好的建议是使用QtCreator来开发,虽然也可以使用其他 ...

  3. spiderFlow学习笔记

    1.下载demo demo地址:代码下载,文档地址:文档下载 2.加入selenium插件 文档有些,但我琢磨了好一会(QAQ) ①先去码云下载 spider-flow-selenium ②再把插件丢 ...

  4. 来自多彩世界的控制台——C#控制台输出彩色字符画

    引言 看到酷安上有这样一个活动,萌生了用 C# 生成字符画的想法,先放出原图.   酷安手绘牛啤     §1 黑白 将图像转换成字符画在 C# 中很简单,思路大致如下: 加载图像,逐像素提取明度. ...

  5. Base64编码解码 支持解码为 16进制

    https://base64.xhlylx.com/

  6. SpringBoot自定义拦截器(多个拦截器)

    在 Spring Boot 中要实现自定义拦截器需要实现 HandlerInterceptor 接口,并重写 preHandle.postHandle 和 afterCompletion 方法: im ...

  7. Mp4V2与ffmpeg静态库符号冲突问题解决

    一.为什么静态符号会冲突 无论macho二进制类型,还是Windows上的PE格式,还是Linux上的ELF格式,里面都是按照特定格式存放的一个程序的代码和数据 比如Linux下的可执行文件格式,大致 ...

  8. 使用jasypt对springboot配置信息加密

    1.pom文件增加依赖 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactI ...

  9. yum install 出错

    ``` yum -y install ansible ``` 出错 一直在刷屏,刚开始以为在安装但是最后没有安装成功 百度发现是这是redhat7和8的yum源混用 1.先确认本机器系统信息 cat ...

  10. scrcpy 安卓投屏

    下载地址:https://github.com/Genymobile/scrcpy 电脑是WINDOWS的,下载WINDOWS版scrcpy:scrcpy-win64-v1.14.zip,解压到:D: ...