接上一个笔记: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. pod(六):初始化容器Init Containers

    目录 一.系统环境 二.前言 三.初始化容器Init Containers 3.1 何为初始化容器Init Containers 3.2 Init Containers与普通容器的不同之处 3.3 I ...

  2. Hangfire 使用笔记 任务可以分离到别的项目中,无需重复部署Hangfire,通过API方式通信。

    "巨人们"的地址 Hangfire Mysql: https://github.com/arnoldasgudas/Hangfire.MySqlStorage 在获取set表数据的 ...

  3. RHEL7.9安装Podman4.1.1并部署Redis集群

    原文链接:RHEL7.9安装Podman4.1.1并部署Redis集群-语雀 环境 操作系统 cat /etc/redhat-release Red Hat Enterprise Linux Serv ...

  4. Ceph对象网关,多区域网关

    目录 Ceph对象网关,多区域网关 1. 文件系统与对象存储的区别 1.1 对象存储使用场景 1.2 对象存储的接口标准 1.3 桶(bucket) 2. rgw 2.1 对象存储认证 2.2 对象网 ...

  5. C语言——函数基本知识

    什么是函数 函数的定义 函数就是程序中独立的功能.(简单来说就是把代码打包成整体,起个名字,方便以后使用) 函数的使用 定义函数的格式 格式: 返回值类型 函数名(形参1,形参2,...) { 函数体 ...

  6. CF1827

    CF1827 A. Counting Orders 简单计数. 两个都排序,双指针维护一下 a[i] 在 b[p] 的位置(a[i] <= b[p]). 那么方案数 \(\times (p - ...

  7. .NET5 ASP.NET Core 使用 EF Core MS SQL SERVER DB First

    .NET5 ASP.NET Core 使用 EF Core MS SQL SERVER DB First 开发工具:VS2019 1.修改appsettings.json,增加一项. "Co ...

  8. 手机上玩 PC 游戏的开源项目「GitHub 热点速览」

    上周国产 3A 大作<黑神话:悟空>开启预售,同时公布游戏将于北京时间 2024.8.20 正式上线.这是一款由「游戏科学」开发的西游题材单机·动作·角色扮演游戏,它采用「虚幻引擎5」制作 ...

  9. SOP页面跳转设计 RAS AES加密算法应用跨服务免登陆接口设计

    SOP页面跳转设计 RAS AES加密算法应用跨服务免登陆接口设计 SOP,是 Standard Operating Procedure三个单词中首字母的大写 ,即标准作业程序,指将某一事件的标准操作 ...

  10. Linux下安装PHP环境

    Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此的,文章发布时间已过于久远,编排和内容不一定完整,还请谅解` Linux下安装PHP环境 日期:2018-5-7 阿珏 ...