unity C# OOP学习笔记之七(事件)

什么是事件
1)事件是一种设计模式!
又叫事件【事件设计模式】【事件模式】【事件模型】
叫通知模型
叫观察者设计模式【观察者模式】【观察者模型】
叫监听模型
事件的使用步骤严格固定
2)
事件是声明为委托类型的类的成员,
表示类的偶发的行为
一旦这个行为发生,往往要引起其它行为【方法】的自动执行
事件是用来实现两个或多个行为的联动调用的。
3) 事件源 响应者

我感冒 我看病
语法:事件源:定义事件的类》
响应者【观察者】:行为2所在的类

事件的使用步骤
定义端1,3 必须再定义段调用端2,4可以在定义段
1定义事件:public event【可以省略 但是不建议】 委托类型 事件名;
2注册事件:事件源对象.事件 += 响应方法 【简化的写法】
传统写法如下
事件源对象.事件 +=new 委托类型(响应方法)
+= 这里注册符号 不同于复合加 i+=i
-= 取消注册
3触发事件:事件在类内部触发,触发代码同委托调用
事件定义在哪里就在哪里触发【1,3同一个类中】
4调用触发事件的方法
在这里插入图片描述

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

namespace 委托
{
    //delegate void Handle();
    class 猫和老鼠
    {
        public static void Main1()
        {
             Cat cat = new Cat();
            //注册事件
            cat.CatMiao += new Mouse().Run;
            //调用触发事件的方法
            cat.Miao();
            
            Console.ReadLine();
        }
    }
    
    class Cat
    {
        //定义事件
        public event Action CatMiao;
        public void Miao()
        {
            Console.WriteLine("喵喵");
            //触发事件
            if (CatMiao!=null)
            CatMiao();
        }
        
    }
    class Mouse
    {
        public void Run()
        {
            Console.WriteLine("快跑 猫来了");
        }
    }
}

其实微软早已为我们定义好了一套泛型委托供我们使用,以免我们在自己使用时还繁琐重复的去定义它,他们分别是Action,Func和Predicate

(1). Action
Action是无返回值的泛型委托。
Action 表示无参,无返回值的委托
Action<int,string> 表示有传入参数int,string无返回值的委托
Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托
Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托
Action至少0个参数,至多16个参数,无返回值。

(2). Func
Func是有返回值的泛型委托
Func 表示无参,返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
Func<T1,T2,T3,int> 表示传入参数为T1,T2,T3(泛型)返回值为int的委托
Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

(3). Predicate
predicate 是返回bool型的泛型委托
predicate 表示传入参数为int 返回bool的委托
Predicate有且只有一个参数,返回值固定为bool

事件模式的优点:分成多步
平台进行封装 共性常用的封装,
程序员完成个性化的即可!
发现 委托不用自己定义
事件不用自己定义
触发不用自己去实现
自己仅仅:注册,写方法即可!

何时使用委托而不使用接口
共性:声明和实现分开的:实现接口,实现委托
不同:最大的不同 接口实现在 定义端
委托实现在 调用端 灵活 不确定多样性

要封装一组方法,方法签名不同 接口
要表示一类方法,签名相同 委托!
委托和接口都允许类设计器分离类型声明和实现。
任何 类或 结构都能继承和实现给定的 接口。
可以为任何类上的方法创建 委托,前提是该方法符合委托的方法签名。
接口引用或委托可由不了解实现该接口或委托方法的类的对象使用

既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?
在以下情况下,请使用委托:
• 当使用事件设计模式时。
• 当封装静态方法可取时。
• 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
• 需要方便的组合。
• 当类可能需要该方法的多个实现时。
在以下情况下,请使用接口:
• 当存在一组可能被调用的相关方法时。
封装多个方法,多个方法签名不同
• 当类只需要方法的单个实现时。 类:接口
• 当使用接口的类想要将该接口强制转换为其他接口或类类型时。
Dogobj 接口 obj=(接口)Dogobj
• 当正在实现的方法链接到类的类型或标识时:例如比较方法。
给类扩展功能时,自定义类 要有个比较的方法,实现比较接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值