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

发布时间 2023-10-27 17:37:51作者: Stephen_Young

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