巧用委托

在开发过程中我们总会听到“委托”这个东西,尤其是在这次的高校云平台中。那么我们今天就来一探究竟:

从字面上来讲,委托有代理的意思:A委托B去买东西,那么B就是A的代理去执行“买东西”这个行为。但是从程序上来讲,委托是一种引用方法的类型,委托方法可以像其他任何方法一样。简单地说就是,委托是一种数据类型,它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法。

下面来看一个例子:

在不使用委托的情况下,我们要实现“使用英汉两种自我介绍”的效果,我们就要首先定义两个自我介绍的方法:英语介绍和汉语介绍两种:

           /// <summary>
          /// the English speaker:英语介绍方式
         /// </summary>
          /// <param name="name">The name.</param>
          public void EnglishSpeaker(string name)
          {
             Console.WriteLine(
                  string.Format("Hello my name is {0} and I am English speaker.\n", name));
          }
         /// <summary>
         /// the Chineses speaker:汉语介绍方式
         /// </summary>
         public void ChineseSpeaker(string name)
        {
             Console.WriteLine(
                 string.Format("您好我的名字叫{0},我是讲普通话的。\n", name));
         }

定义好两个方法之后,我们来编写主函数,调用两种方法实现不同语言的自我介绍:

          /// <summary>
          /// 根据上下文调用不同的方法
         /// </summary>
         /// <param name="name">string</param>
         /// <param name="lang">enum</param>
         private static void Say(string name, Language lang)
         {
           switch (lang)
            {
                case Language.Chinese:
                     Program.ChineseSpeaker(name);
                     break;
                 case Language.English:
                     Program.EnglishSpeaker(name);
                     break;
                 default :
                     break;
             }
        }

而在主函数中我们要使用Switch……case 或者if……else来判断是使用英语自我介绍还是汉语的自我介绍。但是,如果我们现在想要增加一种阿拉伯语的自我介绍方式,虽然可以再增加一个自我介绍的方法,并且在主函数中通过增加case语句来增加调用的情况。那么问题来了,只要增加自我介绍的语言时,我们就要写一个相应语言的函数吗?那么,我们程序的主函数中将会有N个case语句,来列举我们需要的N个语言的自我介绍。

当然不是。因为这样不但不利于系统的扩展和维护,而且对面向对象的思想也有所违背。所以,我们就要使用委托这一方法。

首先我们定义一种委托类型SpeakDelegate,然后通过say方法看看如何使用委托变量。

<span style="font-size:18px;">    Private delegate void SpeakDelegate(string name);</span>

然后我们通过修改Say方法来使用委托变量:

    private static void Say(String name,SpeakDelegate speaker{
           speaker(name);
    }

最后我们在程序的主函数中就可以直接这么写:

<span style="font-size:18px;">    Program.Say("张三",<strong><span style="color:#ff0000;">ChineseSpeaker</span></strong>);   //传递函数名进行委托方法的绑定
    Program.Say("zhangsan",EnglishSpeaker);
    Program.Say("みょうじ",JapanSpeaker);

经过修改,我们的函数名已经被作为了Say方法的参数,而这也就是委托的思想了。

相比之前的,主函数中有效地消除了“Switch …… case”的判断语句,程序变得简单,也开始符合OOP中的开闭原则。而且使用委托的技术之后,参数已经不再是委托类型,而是一个委托类型变量。现在我们调用Say方法只需要传递一个name和具体的实现函数名就可以了。

时间: 2024-10-22 10:56:40

巧用委托的相关文章

巧用jQuery委托事件

平时做前端开发引用最多的框架无非就是jQuery,他封装了js的addEventListener,例如: 1 $("ul li").click(function(){/* ... */}) 2 3 /*或者*/ 4 5 $("ul li").on("click",function(){/* ... */}) 以上使用事件绑定,但是会给每个li绑定click事件,如果使用delegate(委托)方法就能减少这样事件的监听数量,改善代码性能: $(&

委托、匿名方法、Lambda表达式的演进

假设给我们一个泛型对象List<T>,T为int类型,要求我们使用该对象方法FindAll(Predicate<T> match)从中找出该List中的偶数,您如何实现? 说明一下:Predicate<T>是一个泛型委托,它的原型为public delegate bool Predicate<T>(T obj),该委托传入一个T类型对象,经逻辑判断后返回布尔值. 委托 可能您首先想到的是用委托实现,实现方法如下: //方法1staticvoid Method

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

C# 委托,Lambda表达式,事件

本文章参考sikiC#高级篇,转载请注明出处. 什么是委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托与使用 声明委托有四种方式.一种是原生的,另外三种是C#为了方便给我们封装好的. 四种声明方式分别为delegate, Action, Func, 在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编

泛型委托当参数传递

假如有一个Person类: public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } 执行一个方法: /// <summary> /// 传递一个泛型委托方法 /// </summary> /// <param name="acti

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

泛型委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型委托 { public delegate int DelCompare<T>(T t1, T t2); // public delegate int DelCompare(object o1, object o2); class Progra

javascript中的事件委托

这几天看到一个面试题,大概就是,让你给1000个li都添加一个click事件,应该怎么添加?大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看. 首先说一下事件冒泡和事件捕获机制,事件冒泡是有微软公司提出来的,事件捕获是有网景公司提出来的,当时两家是争论的不可开交,后来w3c也没办法,就采取了折中的方式,事件产生后先捕获后冒泡, 通常,在js中监听事件的方法共有三