接上一个笔记: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. apisix~自定义插件的部署

    参考 https://docs.api7.ai/apisix/how-to-guide/custom-plugins/create-plugin-in-lua https://apisix.apach ...

  2. 数据库—安全性控制DCL

    文章目录 授予数据库权限 授予用户能够授予其他用户的权限 收回权限 数据库的权限(特殊) 授予数据库权限 这里的用户是指数据库DBMS中创建的用户,而不是程序中的账户用户. 授予某个/多个表的某一个/ ...

  3. C语言:学生成绩排名----冒泡排序

    题目: /*     输入10个学生成绩.     计算总分以及平均分数.     求出高于等于平均分的人数.     再按降序(由大到小)排序成绩并输出      */ 用到的冒泡算法代码模板: / ...

  4. Docker部署深度学习模型

    Docker部署深度学习模型 基础概念 Docker Docker是一个打包.分发和运行应用程序的平台,允许将你的应用程序和应用程序所依赖的整个环境打包在一起.比如我有一个目标检测的项目,我想分享给朋 ...

  5. WEB攻防-代码特性

    WEB攻防-代码特性 目录 WEB攻防-代码特性 ASP 如何判断网站搭建是否是asp ASP常见的搭配组合 ASP语言的漏洞点(从哪一方面入手) ASP-数据库-MDB下载 ASP-数据库-ASP后 ...

  6. 史上最强 AI 翻译诞生了!拳打谷歌,脚踢 DeepL

    CoT 推理范式 默认情况下,大语言模型通常是直接给出问题的最终答案,中间推理过程是隐含的.不透明的,无法发挥出大模型最极致的理解能力.如果你用它来充当翻译,可能效果和传统的机器翻译也差不了太多. 如 ...

  7. kettle从入门到精通 第四十七课 ETL之kettle mongo output 写入

    1.上一节课我们学习了mongo input读取步骤,本节课我们一起学习下mongo out 写入步骤,该步骤可以将数据写入到mongo中,如下图所示. 2. 配置mongo连接,有两种方式,如截图所 ...

  8. INFINI Labs 产品更新 | 修复 Easysearch 跨集群复制索引同步问题,Gateway 内存异常增长等问题

    INFINI Labs 产品又更新啦~,本次更新主要对 Easysearch.Gateway.Console.Agent 等产品功能进行优化和相关 Bug 修复,解决了内存异常增长等问题,以下是详细说 ...

  9. C#.NET 使用Task.Run和Task.Delay 延时执行任务(代码)

    C#.NET 使用Task.Run和Task.Delay 延时执行任务(代码) 环境: .NET 4.5.2 .NET WEB MVC + WEB API. 示例代码: using CommonUti ...

  10. .NET5 IIS ASP.NET CORE 部署时 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure

    .NET5 IIS ASP.NET CORE 部署时 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure 部署机器只安装了dotnet-hos ...