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

Posted miro

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重温面向对象核心 下 : 你一定能看懂的委托和事件相关的知识,希望对你有一定的参考价值。

 

实例解读面向对象核心,所有例子基于 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 中,理解了吗?

 

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

 

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

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

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

观察者模式结构:

 技术图片

 

观察者模式例子:

 技术图片

 

 祝学习进步。

 

 技术图片

 

以上是关于重温面向对象核心 下 : 你一定能看懂的委托和事件的主要内容,如果未能解决你的问题,请参考以下文章

大白话聊聊微服务——人人都能看懂的演进过程

小白也能看懂的 Laravel 核心概念讲解

小白也能看懂的 Laravel 核心概念讲解

人人都能看懂的 Python 装饰器入门教程

C#委托,事件最初浅的和最易看懂的学习笔记

小白都能看懂的 Dubbo 入门