接上一个笔记:https://www.cnblogs.com/StephenYoung/p/17792668.html

现在增加了一个新的朋友类:Friends

这个类构造如下:

从上到下依次是:

1、字段名称、

2、要离开的事件、

3、方法--离开主人家、

4、Friends构造函数(方法)、

5、属性---体重、

6、方法--感谢、

7、方法--吃席、

Friends类的代码如下:

点击查看代码
 class Friends
{
//定义字段Name,这个在构造函数中使用,不可中途修改
private string Name; public event _dele_StringIn E_Leave;//朋友类声明一个 E_Leave 事件,别人可以订阅 //朋友类 的构造函数,声明了构造函数以后,原来的默认构造函数Friends()就不可再用;
public void Leave()
{
Console.WriteLine($"朋友{ this.Name} ({ Weight.ToString()}斤)说:谢谢招待,我要走了,再见!");
this.E_Leave?.Invoke("下次再见!!!");//此类自己在做某事的时候回去执行事件;这时所有的订阅此事件的对象都会做出自己的事件处理器;
}
public Friends(string name)
{
this.Name = name;
}
//属性Name
public int Weight { get; set; }
public void Thanks()
{
Console.WriteLine($"朋友{this.Name}({Weight.ToString()}斤):谢谢您的招待,我就不客气了!");
}
public void Eat()
{
Console.WriteLine($"朋友{this.Name}({Weight.ToString()}斤):我开始吃饭了!");
}
}

这里重点说下这个要离开的事件是如何开发的。

(1)首先在Namespaec下与Dad等类平级的位置定义一个委托,此处定义的一个委托带一个参数;

namespace MomDadSon_EventEat
{ public delegate void _dele_StringIn(string s);//定义一个带1参数的委托,用于朋友类来定义event

(2)在Friends 的class下定义event;

    class Friends
{
//定义字段Name,这个在构造函数中使用,不可中途修改
private string Name; public event _dele_StringIn E_Leave;//朋友类声明一个 E_Leave 事件,别人可以订阅
如何使用Friends的E-Leave事件?

假设现在是这样的场景,现在有个朋友王刚他来到了小新家做客,如是,wanggang肯定也会订阅妈妈的“喊吃饭”事件——朋友用他自己的感谢方法——和吃席方法——

来订阅妈妈的事件;那么代码将会这么写:现实化一个150斤的朋友唤作王刚,他订阅小新妈妈的事件;

            Friends friend_wanggang = new Friends("王刚");
friend_wanggang.Weight = 150; mom.CallEat += friend_wanggang.Thanks;
mom.CallEat += friend_wanggang.Eat;

于是,不用再修改其他地方。这次当mom的cool方法再执行时。结果将会如下:

上面Friend类定义一个“他吃完饭要离开的事件”--。假设现在是爸爸一直在陪朋友吃饭喝酒,所以只有他订阅了朋友的这个“要离开”的事件;因为Dad类目前只有一个Eat()的方法,很显然,如果拿Eat()方法去响应朋友的要离开的事件,不合理。那么此时我们修改dada class增加一个方法——送客SendCustomer(string saying);

 public void SendCustomer(string saying)
{
Console.WriteLine($"爸爸扶着醉醺醺的客人送到大门口,并依依不舍地说:{saying}");
}

然后我们在主业务逻辑处添加,订阅关系,爸爸这个类的一个实例来订阅具体的朋友对象wanggang的 要离开 的事件;

            //其他人订阅朋友具体某个对象的E_Leave 事件
friend_wanggang.E_Leave += dad.SendCustomer;

在朋友的Leave()方法里,有一行执行事件的响应;

        public void Leave()
{
Console.WriteLine($"朋友{ this.Name} ({ Weight.ToString()}斤)说:谢谢招待,我要走了,再见!");
this.E_Leave?.Invoke("下次再见!!!");//此类自己在做某事的时候回去执行事件;这时所有的订阅此事件的对象都会做出自己的事件处理器;
}

于是,只要王刚执行Leave()这个事情时,由于小新爸爸(具体对象)提前订阅了王刚的离开事件,小新爸爸的送客方法就会被执行。

代码执行结果如下:

类、事件与对象---Dad&Mom&Friends(进阶事件)的更多相关文章

  1. day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版

    day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ...

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

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

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

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

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

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

  5. jQuery事件,对象以及插件

    回顾 1 基本使用 2 jquery 选择器 3 筛选器 过滤 查找 串联 4 DOM 操作 内部插入 append()appendTo()prepend()prependTo() 外部插入 afte ...

  6. QT_8_Qt中的事件处理_定时器事件_定时器类_事件分发器_事件过滤器_绘图事件_高级绘图事件_绘图设备_QFile 文件读写_QFileInfo文件信息

    Qt中的事件处理 1.1. 捕获QLabel中是鼠标事件 1.2. enterevent 鼠标进入 1.3. leaveevent 鼠标离开 1.4. 鼠标按下MyLabel::mousePressE ...

  7. js中的DOM事件与对象

    概念图 document.getElementById("bb"); 根据id找到bb,只能找一个哦 var aa = document.getElementById(" ...

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

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

  9. visual studio2010 “类视图”和“对象浏览器”图标

    “类视图”和“对象浏览器”显示一些图标,这些图标表示代码实体,例如命名空间.类.函数和变量. 下表以图文并茂的形式说明了这些图标. 图标 说明 图标 说明 namespace 方法或函数 类 运算符 ...

  10. Javascript 事件对象(二)event事件

    Event事件: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...

随机推荐

  1. Aliplayer通过HLS流式播放Aliyun Mps(媒体处理)转码的加密视频

    前言 公司需求,上传的视频需要加上公司Logo,同时播放需要采用流式播放禁止下载. 现有的环境在阿里云上,所以自然想到了阿里云的产品[媒体处理]的转码功能. 转码配置 配置比较简单,采用阿里云HLS标 ...

  2. AIRIOT物联网低代码平台如何配置欧姆龙omron驱动?

    数据采集与控制是物联网的核心能力之一,AIRIOT物联网低代码平台提供了丰富的驱动,兼容了市面上95%以上的传感器.控制器及数据采集设备等,并且在持续增加中,能够快速.便捷地实现数据采集与控制功能. ...

  3. 安装node-sass失败原因及解决办法汇总

    node-sass 安装过程 npm 拉下 node-sass包: 根据node版本和node-sass版本拉取对应的binding.node编译器,原因是sass的编译语言比较特殊,需要下载对应版本 ...

  4. CSS——样式继承

    CSS的样式表继承指的是,特定的CSS属性向下传递到子孙元素.总的来说,一个HTML文档就是一个家族,然后html元素有两个子元素,相当于它的儿子,分别是head和body,然后body和head各自 ...

  5. 【论文笔记】R-CNN系列之论文理解

    [深度学习]总目录 RCNN全称region with CNN features,即用CNN提取出Region Proposals中的featues.RCNN系列论文(R-CNN,Fast R-CNN ...

  6. GeoGebra作圆的切线

    参考文档:<GeoGebra入门教程>唐家军 1. 目的 使用GeoGebra作出过一点的圆的切线. 2. 构造过程 文档种的描述如下: 按照上述构造过程,在输入条形框中依次输入上面的指令 ...

  7. js随机数 比较运算符

       // 生成一个随机数 1 - 100 范围内的随机数         // 大家先记住 JavaScript 生成随机数值的 公式         // 如果要 生成 a - b  范围内的数值 ...

  8. jquery中封装了三种ajax请求方式

          // jQuery中封装了3种 ajax 请求方式         // 1, get请求方式         // 2, post请求方式         // 3, 综合请求方式    ...

  9. 配置系统未能初始化。“System.Transactions.Diagnostics.DiagnosticTrace”的类型初始值设定项引发异常。

    配置系统未能初始化."System.Transactions.Diagnostics.DiagnosticTrace"的类型初始值设定项引发异常. 1.是检查当前程序的 App.c ...

  10. 题目:SHMIP The subglacial hydrology model intercomparison Project

    SHMIP(冰下水文模型比较计划)是一个致力于解决冰下水文多种理论方法问题的项目.该计划通过构建一系列综合模拟实验,并对运行这些模拟的各参与模型的结果进行比较,以达到其目标.这将有助于潜在的模型用户更 ...