重温面向对象核心 下 : 你一定能看懂的委托和事件

实例解读面向对象核心,所有例子基于 C#,涉及我们实务中最常关心的问题:

1、封装、继承、多态;

2、抽象类、接口;

3、委托、事件。

三、委托和事件

通俗的说,我们使用委托的目的是“实现将方法作为参数传递的效果”,直接结合例子说明。

我们还是用基于上次的示例往下更改。

场景设定:根据图形的不同,返回不同的面积算法。

        // 参数为图形形状, 返回该图形的面积计算公式

        public string GetAreaAlg(string shapeName)

        {

            if (shapeName=="矩形")

            {

                return "长 × 宽";

            }

            else if (shapeName == "圆形")

            {

                return "pi * r * r";

            }

            else

            {

                return "该图形面积算法未定义";

            }

        }

当图形越来越多时,方法体中的分支就会膨胀。

这时候我们很自然的想到,如果我们可以直接将方法作为参数传进来,那么就可以不需要这些分支了。

类似如下:

        public string GetAreaAlg(某种类型 计算面积公式的方法)

        {

            执行此 计算面积公式的方法;

        }

好了,我们顺着这个思路改造一下:

        #region delegate相关演示

        //声明一个委托

        public delegate string GetAreaAlgDelegate();

        // 矩形的面积算法

        public string GetRectangleAreaAlgorithm()

        {

            return "矩形的面积算法:长 × 宽";

        }

        // 圆形的面积算法

        public string GetRCircleAreaAlgorithm()

        {

            return "圆形面积公式:pi * r * r";

        }

        public string GetAreaAlg(GetAreaAlgDelegate GetAlgorithm)

        {

            return GetAlgorithm();

        }

        #endregion

这个时候,在Home/Index中直接调用即可:

            string strAlgorith = GetAreaAlg(GetRectangleAreaAlgorithm);

加个断点调试一下,可以看到返回了 矩形的面积算法:长 × 宽

理解了吗?我们来小结一下。

委托是对函数的封装,可以当作给方法的特征指定一个名称,我们可以和普通的参数做类比来理解。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用分支语句,同时使得程序具有更好的可扩展性。

接下来再谈下事件。

事件是委托的一种特殊形式,当事件发生时,事件对象通知处理过程。

我们改造下我们的例子,加一句就行,紧接着声明委托下面声明事件:

        //声明一个委托

        public delegate string GetAreaAlgDelegate();

        // 声明一个事件

        public event GetAreaAlgDelegate GetArea;

同样在Home/Index中,调用时先登记事件:

            GetArea += new GetAreaAlgDelegate(GetRCircleAreaAlgorithm);

            string res= GetArea();

加个断点调试一下,可以看见返回了 圆形面积公式:pi * r * r

我们通过实例化委托,将GetRCircleAreaAlgorithm方法登记到事件 GetArea 中,理解了吗?

我们按一下鼠标按钮,触发某个操作,执行某个方法就是典型的应用。

委托和事件实际上是观察者模式的应用。

具体的应用场景我就不展开了,大家可以思考。

仅以两张图片说明一个例子,启发大家思考。

观察者模式结构:

观察者模式例子:

祝学习进步。

原文地址:https://www.cnblogs.com/miro/p/11312992.html

时间: 2024-11-09 03:10:38

重温面向对象核心 下 : 你一定能看懂的委托和事件的相关文章

[iOS逆向实战 之六]看懂mach-o(1)

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 在win下搞逆向需要看懂pe,同样搞iOS安全攻防必须看懂mach-o格式,水果的官方mach-o文档在此:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html 本文中实际项目分析,来达到“看懂”的目的,使用的工具还是前一篇blog所用的hopper. 先将目标文件拖进h

看懂redis

[教你看懂redis配置 – 简介] 我们可以在启动redis-server时指定应该加载的配置文件,方法如下: 复制代码 代码如下: $ ./redis-server /path/to/redis.conf 接下来,我们就来讲解下redis配置文件的各个配置项的含义,注意,本文是基于redis-2.8.4版本进行讲解的. redis官方提供的redis.conf文件,足有700+行,其中100多行为有效配置行,另外的600多行为注释说明. 在配置文件的开头部分,首先明确了一些度量单位: # 1

C#编程语言与面向对象——核心

面向对象的核心 (1).封装 封装的类=数据+对此数据所进行的操作(即算法) 封装起外界不必需要知道的东西,指向外界展现可供展示的东西. 小到一个简单的数据结构,大到一个完整的软件子系统.静态的如某软件系统要收集数据信息项,动态的如某个工作处理流程,都可以封装到一个类中. 具备这种意识,是掌握面向对象分析与设计技巧的关键. (2).抽象 在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事务所属的类型,分析它们拥有哪些性质与功能,再将他们抽象为在计算机虚拟世界中才有意义的实体——

Python学习—面向对象学习下

面向对象下 1.构造方法与析构方法 class People(object): # 构造方法:__init__(),在实例化对象时自动执行的方法 def __init__(self, name, age): self.name = name self.age = age print("创建对象成功.......") # 析构函数:__del__(), 当你删除对象时,自动调用的方法 # 删除对象:del 对象名 def __del__(self): print("删除对象成功

【F12】谷歌浏览器--前台效果可以在不访问服务器的前提下直接改样式看效果是否是预期值。

F12-前台效果可以在不访问服务器的前提下直接改样式看效果是否是预期值. 1.Element---页面所有元素,通过它可以做selenium的元素定位,删除页面元素,增加页面属性(通过增加页面属性便于自动化的时候更好的定位页面元素), 1)删除页面元素: 右键---delete element后效果如下: 2)增加页面属性: 3)改变页面效果 2.Console-可以debug前台代码element中或sources中既存即已有的js中的脚本  或者做断点看返回值是什么,返回值是否正确. 3.S

《大话西游》20年后重映(附影评:《大话西游》你真的看懂了吗?)

2014-10-25 02:43:24 来源: 北京日报(北京) 本报讯 (记者 周南焱)"电影里的台词差点儿都能背,但在影院里再看还是会笑.看到最后紫霞仙子死的时候.还是忍不住落泪! "昨天下午,经典老片<大话西游>在海航活力天宝影城又一次上映,一位重温影片的观众如是说.还有观众反映,用如今的电影技术水准来看,<大话西游>确实有点老土,但从内容来看还是那么亲切. 周星驰主演的<大话西游>20年前公映,当时票房大败. 但谁也没想到,该片通过盗版光碟和

只有程序员可以看懂的笑话 大全集(2)

1.程序猿最烦两件事,第一件事是别人要他给自己的代码写文档,第二件呢?是别人的程序没有留下文档. 2.程序猿的读书历程:x 语言入门 -> x 语言应用实践 -> x 语言高阶编程 -> x 语言的科学与艺术 -> 编程之美 -> 编程之道 -> 编程之禅-> 颈椎病康复指南. 3.还没上大学的时候,高三暑假,跑到家那边的图书城想买传说中的C++的书,然后看到一本C#,我一看,嘿,这个++还写得挺艺术的,重叠起来了,于是把C#买了回来-- 4.问:程序猿最讨厌康熙

只有程序员可以看懂的笑话 大全集(1)

宪法顶个球!中国的法律都是.txt文件,不是.exe文件. 程序员:三年前,当我写下这个的时候,只有上帝和我能够看懂. 现在,只有 上帝能看懂了. 同事说,他在写i++的时候总觉的自己写的是 我艹.........有木有同感??? ? 程序员,年二十有二,始从文,连考而不中. 遂习武,练武场上发一矢,中鼓 吏,逐之出. 改学IT,自撰一函数,用之,堆栈溢出. <桃花庵--程序员版>写字楼里写字间,写字间中程序员: 程序人员写程序, 又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠: 酒醉酒醒日

看懂物联网fr

看懂物联网 2015-10-11 物联网世界 1.第三次IT浪潮 互联网时代的特征是信息驱动了生产力,无论众包.订单式生产这些理论:还是B2C.O2O各类业务模式:归根结底,是信息优化了生产关系.人或以快递员身份直接对信息进行反馈,或者作为商家去控制生产和提供服务,人是信息与现实世界的一个接口. 后互联网时代信息与世界的接口将发生扩展,物联网世界里信息将直接驱动生产工具,重构和优化人类百年工业沉淀的生产引擎.这将是物联网世界的核心特征. 怎么理解互联网与物联网之间的异同呢,可以用两个场景来对比.