类、事件与对象---Dad&Mom&Friends(进阶事件)
接上一个笔记: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()这个事情时,由于小新爸爸(具体对象)提前订阅了王刚的离开事件,小新爸爸的送客方法就会被执行。
代码执行结果如下: