zoukankan      html  css  js  c++  java
  • [转]ASP.NET中的委托例子

    1.定义

      委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数为返回值。简单理解Delegate委托(或代理)是一种数据类型:它的变量可以引用到某一个符合要求的方法上,通过委托可以间接地调用该方法。

    2.使用

    使用委托的四部曲:

    • 定义一种委托类型
    • 委托执行时要调用方法
    • 定义一个委托实例
    • 委托实例的调用

    我们可以这样子认为:委托是一个类,它定义了方法的类型,使得可以将方法当作别一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    3.自定义委托

    前面的话有点难理解,接下来我们通过具体的例子分析一下何谓委托,该如何实现委托。现在不是很喜欢搞多国语言化的吗?看看如何让我们的程序会说多种语言吧。

     1         /// <summary>
     2         /// the English speaker.
     3         /// </summary>
     4         /// <param name="name">The name.</param>
     5         public void EnglishSpeaker(string name)
     6         {
     7             Console.WriteLine(
     8                 string.Format("Hello my name is {0} and I am English speaker.\n", name));
     9         }
    10         /// <summary>
    11         /// the Chineses speaker.
    12         /// </summary>
    13         public void ChineseSpeaker(string name) 
    14        {
    15             Console.WriteLine(
    16                 string.Format("您好我的名字叫{0},我是讲普通话的。\n", name));
    17         }

    好啦现在我们有两个方法分别是说普通话和英语,现在我们的程序会说普通话和英语啦。现在我们考虑究竟什么时候讲普通话什么时候讲英语,那不简单我们加个判断就OK啦,是的我们可以通过switch或者if else就可以实现啦。

     1         /// <summary>
     2         /// 根据上下文调用不同的方法
     3         /// </summary> 
     4         /// <param name="name">string</param>
     5         /// <param name="lang">enum</param>
     6         private static void Say(string name, Language lang)
     7         {
     8             switch (lang)
     9             {
    10                 case Language.Chinese:
    11                     Program.ChineseSpeaker(name);
    12                     break;
    13                 case Language.English:
    14                     Program.EnglishSpeaker(name);
    15                     break;
    16                 default :
    17                     break;
    18             }
    19         }

    但假设我们现在又要增加新的语言西班牙语,同样我们可以增加西班牙语,但我们必须修改switch语句增加判断,这不符合OOP中的OCP(对扩展开放,对修改关闭原则),这时候委托该登场。

    1         /// <summary>
    2         /// Define speak delegate.
    3         /// </summary>
    4         /// <param name="name"></param>
    5         private delegate void SpeakDelegate(string name);

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

     1         /// <summary>
     2         /// The base say function.
     3         /// </summary>
     4         /// <param name="name">The name.</param>
     5         /// <param name="speaker">The speaker.</param>
     6         private static void Say(string name, SpeakDelegate speaker)
     7         {
     8             ///Inoke the speaker function.
     9             speaker(name);
    10         }

    现在我们的参数已经不是枚举类型了,而是一个委托类型变量,而且实现的具体代码也没有了switch语句了,比之前简单了许多。现在大家知道如何去调用Say方法吧!没错我们只需传递一个name和一个具体实现函数名就OK了。

    1             ///传递函数名进行委托方法绑定
    2             Program.Say("钧航", ChineseSpeaker);
    3             Program.Say("JK.Rush", EnglishSpeaker);

     来源:http://www.jzxue.com/wangzhankaifa/asp-net/201104/24-7245.html

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/seasons1987/p/2735600.html
Copyright © 2011-2022 走看看