首页 > 其他分享 >类、事件与对象---Dad&Mom&Friends(进阶事件)

类、事件与对象---Dad&Mom&Friends(进阶事件)

时间:2023-10-27 17:46:53浏览次数:35  
标签:Dad Leave 进阶 朋友 --- 事件 Friends public Name

接上一个笔记: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,Leave,进阶,朋友,---,事件,Friends,public,Name
From: https://www.cnblogs.com/StephenYoung/p/17792852.html

相关文章

  • szfpga 高云gowin国产开发板GW2AR-18核心板fpga cpld测试板
    1.概述         国产FPGA是最近几年起来的产品,具有性价比高特点。而GOWIN属于国产FPGA成员,在服务和芯片都是比较大的优势,很多用户都用在LED控制,电机控制,PLC设备上,以及用于替换Lattice厂家中低端的芯片。    GW2AR-18 开发板采用GW2AR-18-LV9EQ144器件,是属于晨......
  • reverse--[HZNUCTF 2023 preliminary]easyAPK
    首先这是一个apk文件,一开始我是用jadx打开的,发现要aes加密啥的,后面我用jeb打开,发现账号和密码都已经解密出来了真的很方便,然后根据代码逻辑判断,这应该是安卓程序的一个登录界面,接下来我们安装一下apk,输入账号admin和密码reiseasy。得到一张图片如下:然后我们将数据提取出来,......
  • 世微 DC-DC 降压恒压电源管理芯片 12V6A 线路应用图 AP8854
    这是一款12V6A电源驱动线路图  1,产品描述     AP8854一款宽电压范围降压型DC-D电源管理芯片,内部集成使能开关控制、基准电源、误差放大器、过热保护、限流保护、短路保护等功能,非常适合宽电压输入降压使用。AP8854带使能控制,可以大大节省外围器件,更加适合......
  • 网安--sql注入流程
    1、判断有无注入点使用and1=1测试随便输入内容不报错:没有注入点随意输入内容报错了:有注入点2、猜解列名orderby1/2/3/4...出现报错的前一个就是列名的数量3、报错,判断回显点union?id=1unionselect1,2,3...上一步确定了字段数量,因为union的特性前后查询的列的数量要......
  • 软考系列(系统架构师)- 2013年系统架构师软考案例分析考点
    试题一软件架构(根据描述填表、ESB定义和功能)【问题1】(10分)服务建模是对RampCoordination信息系统进行集成的首要工作,公司的架构师首先对RampCoordination信息系统进行服务建模,识别出系统中的两个主要业务服务组件:(1)RampControl:负责RampCoordination信息系统中相关各种......
  • Protocol - Socket v.s. WebSocket
    总结什么是socket?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。  什么是WebSocket?WebSocket是实现了浏览器与服务器的全双工通信协议,一个模拟Socket的应用层......
  • http-template实现原生分页
     packagemainimport( "gorm.io/driver/mysql" "gorm.io/gorm" "html/template" "io" "math" "net/http" "os" "strconv")//商品结构体typeGoodsstruct{ Idint......
  • update-alternatives用法
    sudoupdate-alternatives--listgo现实go有哪些替换版本sudoupdate-alternatives--configgo选择特定版本gosudoupdate-alternatives--install/usr/bin/gogo/usr/local/go/bin/go1 --slave/usr/bin/gofmtgofmt/usr/local/go/bin/gofmt添加go的新配置,后跟子配......
  • 一文彻底弄懂Linux-Shell编程
    一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式之间至少有一个空格[[测试表达式]]通过[[]]双中括......
  • docker 数据卷-学习
    容器数据卷容器数据存储路径同步在宿主机文件目录做数据持久化保存(目录挂载、映射)不进行这一步,会导致删除容器后,数据直接丢失。容器间数据卷也可以进行共享数据卷的使用,类似于Linux下对目录或文件进行mount1、宿主机目录映射容器内部目录-v宿主机目录:容器内目录(......