技术开发 频道

.NET中的委托:细节详解

   3 .自定义委托

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

/// <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));
        }

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

/// <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语句增加判断,这不符合OOP中的OCP(对扩展开放,对修改关闭原则),这时候委托该登场

/// <summary>
        
/// Define speak delegate.
        
/// </summary>
        
/// <param name="name"></param>
        
private delegate void SpeakDelegate(string name);

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

/// <summary>
        
/// The base say function.
        
/// </summary>
        
/// <param name="name">The name.</param>
        
/// <param name="speaker">The speaker.</param>
        
private static void Say(string name, SpeakDelegate speaker)
        {
            
///Inoke the speaker function.
            speaker(name);
        }

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

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

 自定义委托相信大家都会了,接下来我将介绍一下.NET中委托实现,由于许多使用委托的例子都是事件,所以下面的例子也采用事件。但请大家要注意“可以使用委托,但却没有定义事件”的情况(例如:回调函数)。

0
相关文章