【C#】面向对象多态05---委托/代理

引言

委托的概念很多,且比较抽象,为了方便记忆,这里通过联想的方法与简单例子来记住基本概念,

一、什么是委托?

答:是使用关键字delegate创建的能存储多个方法地址的引用数据类型,调用委托就是在调用这些方法

二、为什么使用委托?

答:为了方便维护代码,方便程序员将问题滞后考虑,提高灵活性等

三、什么时候使用委托?

答:根据实际情况,在定义方法时没想好的内容可以留到调用端(使用时)再实现,还可以根据接口与委托的差异选择使用委托还是接口,比如

当使用事件设计模式时

当封装静态方法可取时

当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时

需要方便的组合

当类可能需要该方法的多个实现时

四、用C#创建委托

步骤1:定义委托(定义端)

a:定义委托类型,创建与委托签名相同的方法

步骤2:创建委托对象(调用端)--创建委托对象就是给委托对象赋值,为委托绑定方法,写法大致可以分两类

b:在调用端创建委托对象,并列出多种写法

步骤3:调用委托(调用端)---和调方法相似,有参数就要写参数,有返回值可以返回

c:调用委托即执行委托存储的方法

注意:委托对象=Lambda表达式=匿名方法

回调执行流程:

-->从调用端(调用该类方法)-->被调用端(执行该方法中的委托)-->调用端(执行委托的方法)-->被调用端(执行该类方法中剩下的代码)-->调用端(该类方法执行结束)--(属于回调)

五、委托的分类

  1. 单播委托执行:一个委托对象只绑定或关联一个方法

如图b中,将一个方法赋值给委托对象,即使不断地重新赋值,也只能存储一个方法的地址,即便调用委托,也只执行这一个方法

  1. 多播委托执行:一个委托对象绑定或关联多个方法 只返回最后方法的结果

如图c中,委托对象 “go”存储两个方法的地址,执行时,依次执行,但只将最后一个方法的返回值作为最终返回值,不会将各个方法的返回值累加后作为最终返回值,所以,有返回值的方法不适合多播执行

六、委托的特点

1.将委托(方法)做为参数传递,可以将一个方法的执行代码注入到另一个方法中
2.实现回调,实现的方式比接口更灵活
3.事件实现的基础(如果委托实现的是联动调用【回调】,这种使用方式,就叫事件【模式】后续介绍)
4.实现任意方法的异步调用(不解释)

七、委托与接口的异同点

相同点:

都是一个数据类型,都可以作为参数,类型声明与具体实现都是分开的

不同点:

1.委托可以实现回调,作为参数,比接口更灵活

2.委托实现在调用端,接口实现在定义端,

3.接口是封装一组方法,但每个方法的签名不同

4.委托表示一类方法,但每个方法要求签名相同

5.其他(比较复杂)

八、小结

【委托/代理】在C#中是一个可以存储多个方法的地址的数据类型(有点像C语言的指针),只要通过调用委托,就相当于在调用方法,此时,委托对象就是个有多个方法地址的中介。

这不禁联想到动漫中的冒险者公会,

委托人(类)发布委托任务(定义方法),

公会就接取并发布委托(定义委托,创建委托),

而每个委托的任务都需要分类,类型相同的为一类(委托的签名相同),

公会可以直接接取并发布委托人的任务(委托创建的第一类写法)

公会还可以自己发布任务(委托创建的第二类写法)

冒险者则接取委托与完成委托(调用委托),

冒险者可以接取单个或多个任务(单播与多播执行),

猜你喜欢

转载自blog.csdn.net/ICD_kfg/article/details/129741419