zy77_C#中的自定义事件以及事件程序中的继承

1.自定义事件

在这里插入图片描述

1.1程序代码

internal class Program
{
    static void Main(string[] args)
    {
        //6.主函数下触发事件
        Dog dog = new Dog();
        Host host = new Host(dog);
        DateTime now = new DateTime(2011,12,31,23,59,50);
        DateTime midnight=new DateTime(2012,1,1,0,0,0);
        Console.WriteLine("时间一秒一秒的流逝");
        while(now<midnight)
        {
            Console.WriteLine("当前时间:" + now);
            System.Threading.Thread.Sleep(1000);//1000ms
            now = now.AddSeconds(1);
        }
        Console.WriteLine("\n月黑风高午夜:" + now);
        Console.WriteLine("小偷悄悄的摸进了主人的屋内......");
        dog.OnAlarm();
    }
}
class Dog
{
    //1.声明关于事件的委托
    public delegate void AlarmEventHandler(object sender, EventArgs e);
    //2.声明事件
    public event AlarmEventHandler Alarm;
    //3.编写引发事件的方法
    public void OnAlarm()
    {
        if(this.Alarm != null)
        {
            Console.WriteLine( "\n小狗报警:汪汪");
            this.Alarm(this, new EventArgs());
        }
    }


}
//4.创建事件的处理程序
class Host
{
    void HostHandleAlarm(object sender, EventArgs e)
    {
        Console.WriteLine("主人:抓住了小偷");
    }
    //5.注册事件处理程序
    public Host(Dog dog)
    {
        dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
    }
}

结果:

时间一秒一秒的流逝
当前时间:2011/12/31 23:59:50
当前时间:2011/12/31 23:59:51
当前时间:2011/12/31 23:59:52
当前时间:2011/12/31 23:59:53
当前时间:2011/12/31 23:59:54
当前时间:2011/12/31 23:59:55
当前时间:2011/12/31 23:59:56
当前时间:2011/12/31 23:59:57
当前时间:2011/12/31 23:59:58
当前时间:2011/12/31 23:59:59
月黑风高午夜:2012/1/1 0:00:00
小偷悄悄的摸进了主人的屋内…
小狗报警:汪汪
主人:抓住了小偷

1.2代码解释:

1. 委托声明

Dog类中,首先声明了一个名为AlarmEventHandler的委托。这个委托定义了一个方法签名,该方法接受两个参数:object sender(事件的发送者)和EventArgs e(包含事件数据的对象,这里只是简单地使用了EventArgs的默认实现,没有传递额外的数据)。

public delegate void AlarmEventHandler(object sender, EventArgs e);

2. 事件声明

Dog类中,使用前面声明的委托类型声明了一个名为Alarm的事件。事件是委托类型的特殊封装,它提供了一种发布/订阅模型,允许类或对象提供通知。

public event AlarmEventHandler Alarm;

3. 引发事件的方法

Dog类中的OnAlarm方法用于在需要时引发(触发)Alarm事件。它首先检查是否有任何订阅者(即是否有方法注册到Alarm事件上),如果有,则调用这些方法。

public void OnAlarm()  
{  
    if(this.Alarm != null)  
    {  
        Console.WriteLine( "\n小狗报警:汪汪");  
        this.Alarm(this, new EventArgs());  
    }  
}

4. 事件处理程序

Host类中,定义了一个名为HostHandleAlarm的方法,该方法符合AlarmEventHandler委托的签名,因此可以作为Alarm事件的处理程序。这个方法会在Alarm事件被触发时执行。

void HostHandleAlarm(object sender, EventArgs e)  
{  
    Console.WriteLine("主人:抓住了小偷");  
}

5. 注册事件处理程序

Host类的构造函数中,通过+=操作符将HostHandleAlarm方法注册为Dog实例的Alarm事件的处理程序。这样,当Dog实例的Alarm事件被触发时,HostHandleAlarm方法也会被调用。

public Host(Dog dog)  
{  
    dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);  
}

6. 主函数

Main方法中,首先创建了DogHost的实例,并通过Host的构造函数将Dog实例的Alarm事件与HostHostHandleAlarm方法关联起来。然后,模拟时间流逝,直到午夜,此时调用DogOnAlarm方法来触发Alarm事件。由于Alarm事件已经注册了HostHandleAlarm作为处理程序,因此会打印出“主人:抓住了小偷”。

while(now<midnight)  
{  
    // ... 时间流逝逻辑  
}  
dog.OnAlarm(); // 触发事件

2.事件程序中的继承

2.1程序

public class AlarmEventArgs:EventArgs
{
    public int numberofThieves;
    public AlarmEventArgs(int numberValue)
    {
        numberofThieves= numberValue;
    }
}
internal class Program
{
    static void Main(string[] args)
    {
        //6.主函数下触发事件
        Dog dog = new Dog();
        Host host = new Host(dog);
        DateTime now = new DateTime(2011,12,31,23,59,50);
        DateTime midnight=new DateTime(2012,1,1,0,0,0);
        Console.WriteLine("时间一秒一秒的流逝");
        while(now<midnight)
        {
            Console.WriteLine("当前时间:" + now);
            System.Threading.Thread.Sleep(1000);//1000ms
            now = now.AddSeconds(1);
        }
        Console.WriteLine("\n月黑风高午夜:" + now);
        Console.WriteLine("小偷悄悄的摸进了主人的屋内......");
        AlarmEventArgs e = new AlarmEventArgs(3);
        dog.OnAlarm(e);
    }
}
class Dog
{
    //1.声明关于事件的委托
    public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    //2.声明事件
    public event AlarmEventHandler Alarm;
    //3.编写引发事件的方法
    public void OnAlarm(AlarmEventArgs e)
    {
        if(this.Alarm != null)
        {
            Console.WriteLine( "\n小狗报警:汪汪");
            this.Alarm(this, e);
        }
    }


}
//4.创建事件的处理程序
class Host
{
    void HostHandleAlarm(object sender, AlarmEventArgs e)
    {
        if (e.numberofThieves<=1)
        {
            Console.WriteLine("主人:抓住了小偷");
        }
        else
        {
            Console.WriteLine("主人:打110报警,我家来了{0}个小偷!", e.numberofThieves);
        }
    }
    //5.注册事件处理程序
    public Host(Dog dog)
    {
        dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
    }
}

2.2结果:

时间一秒一秒的流逝
当前时间:2011/12/31 23:59:50
当前时间:2011/12/31 23:59:51
当前时间:2011/12/31 23:59:52
当前时间:2011/12/31 23:59:53
当前时间:2011/12/31 23:59:54
当前时间:2011/12/31 23:59:55
当前时间:2011/12/31 23:59:56
当前时间:2011/12/31 23:59:57
当前时间:2011/12/31 23:59:58
当前时间:2011/12/31 23:59:59
月黑风高午夜:2012/1/1 0:00:00
小偷悄悄的摸进了主人的屋内…
小狗报警:汪汪
主人:打110报警,我家来了3个小偷!

2.3代码解释:

AlarmEventArgs

这个类继承自 EventArgs 类,用于在事件发生时传递额外的信息。在这个例子中,它传递了一个整数 numberofThieves,表示检测到的小偷数量。构造函数接受一个整数参数,并将其赋值给 numberofThieves 属性。

Dog

  • 委托声明:定义了一个名为 AlarmEventHandler 的委托,该委托接受一个对象(事件的发送者)和一个 AlarmEventArgs(包含事件数据的对象)作为参数。
  • 事件声明:使用 AlarmEventHandler 委托类型声明了一个名为 Alarm 的事件。
  • 引发事件的方法OnAlarm 方法用于在需要时触发 Alarm 事件。它首先检查是否有任何订阅者(即是否有方法注册到 Alarm 事件上),如果有,则调用这些方法,并传递 Dog 实例本身和 AlarmEventArgs 实例作为参数。

Host

  • 事件处理程序HostHandleAlarm 方法是 AlarmEventHandler 委托的一个实现,它根据 AlarmEventArgs 中的 numberofThieves 属性值来决定主人的反应。如果小偷数量小于或等于1,则打印“主人:抓住了小偷”。如果小偷数量大于1,则打印“主人:打110报警,我家来了{0}个小偷!”,其中 {0} 会被 numberofThieves 的值替换。
  • 注册事件处理程序:在 Host 类的构造函数中,通过 += 操作符将 HostHandleAlarm 方法注册为 Dog 实例的 Alarm 事件的处理程序。这样,当 Dog 实例的 Alarm 事件被触发时,HostHandleAlarm 方法也会被调用。

Program

  • 主函数:在 Main 方法中,首先创建了 DogHost 的实例,并通过 Host 的构造函数将 Dog 实例的 Alarm 事件与 HostHostHandleAlarm 方法关联起来。然后,模拟时间流逝直到午夜,此时创建一个 AlarmEventArgs 实例来表示检测到3个小偷,并调用 DogOnAlarm 方法来触发 Alarm 事件。由于 Alarm 事件已经注册了 HostHandleAlarm 作为处理程序,因此会打印出“主人:打110报警,我家来了3个小偷!”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值