语言学习-C#-面向对象-委托和事件

委托(delegate)

定义委托的语法:

[属性] [修饰符] delegate 返回类型 委托类型名(参数列表);

委托没有具体的实现体,它能够代表什么样的方法由它的返还值参数列表决定

委托的实例化:

委托类型名和类名一样,都用于创建对象,用委托类型创建的对象就是委托对象。

语法:

委托对象 = new 委托类型(关联方法)

一个简单实用了委托的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1           //命名空间,相当于java中的包
{
    class Person           //一个主类,于java中不同,主类名不需要和文件名相同
    {
        delegate int myDelegrate(int a, int b);   //申明一个委托,返回值为整形,有两个参数
        public class A
        {
            public static int AddTwo(int x, int y)    //在类A中创建一个AddTwo的静态方法(其他非虚方法都可以)
            {
                return x + y;
            }
        }
        public class B            //这个方法中有主方法
        {
            public static void Main()
            {
                myDelegrate mD = new myDelegrate(A.AddTwo);   //创建一个委托变量mD,是在最前面主类中申明的委托类型,它的关联方法是A类中的静态方法AddTwo
                int sum = mD(2, 2);      //此时的mD委托变量就相当于上一句中的A.AddTow()方法
                Console.WriteLine(sum);
                Console.Read();
            }
        }
    }
}

事件

定义事件的语法:

[访问修饰符] event 委托名 事件名;

一个实例,有一个热水器,当温度达到96度时,会发出警报,显示温度:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
    class Heater
    {
        private int temperature;
        public delegate void BoilHandler(int param);  //定义一个委托类型,无返回类型,有一个参数
        public event BoilHandler BoilEvent;     //定义一个事件,委托类型为BoilHandler,事件名称为BoilEvent
        
        public void BoilWater()        //定义一个烧水的函数
        {
            for(int i = 0; i<100; i++)   //温度从0开始,一直到100
            {
                temperature = i;            
                if(temperature >= 96)        //当温度大于等于96度时,会引发事件
                {
                    if(BoilEvent != null)  //判断一下事件是否为空,及是否定义
                    {
                        BoilEvent(temperature);
                    }
                }
            }
        }
        public class Alarm       //在这个类中有一个提示烧水的函数
        {
            public void MakeAlert(int param)
            {
                Console.WriteLine("滴滴滴~,水已经到了 {0} 度了", param);
            }
        }
       public class Display  //在这个类中,有一个提示水快烧开的函数
       {
           public static void ShowMsg(int param)
           {
               Console.WriteLine("display:水快烧开了,当前温度:{0}",param);
           }
           public void a(int b)
           {
               Console.WriteLine("反正就是输入了");
           }
       }
        public static void Main()
        {
            Heater heater = new Heater();   //创建一个主类,即热水器类
            Alarm alarm = new Alarm();   //创建报警器类

使用 += 号来订阅方法:

            heater.BoilEvent += alarm.MakeAlert;    //给热水器类的事件订阅事件 ,使用的是+=符号
            heater.BoilEvent += Display.ShowMsg;   //再订阅一个静态方法
            Display dis = new Display();
            heater.BoilEvent += dis.a;         //a方法是临时加的,我看到可以订阅多个事件感到奇怪,然后又加了一个。
            heater.BoilWater();
            Console.ReadKey();
        }
    }
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值