C#委托(练习2)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void GreetingDelegate(string name);
/// <summary>
/// 委托和事件在.NetFrameWork中的应用非常的广泛,然而,较好的理解委托和事件对很多接触C#时间不长的人来说并不容易。
/// 它们就像是一道坎儿,过了这个坎儿的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里堵得慌,浑身不自在。
/// 
/// </summary>
public class Test2 : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        GreetingPeople1("励志", ChineseGreeting);
    }
    public void GreetPeople(string name)
    {
        EnglishGreeting(name);
    }
    public void EnglishGreeting(string name)
    {
        Debug.Log("Good Morning," + name);
    }
    //暂且不管这两个方法有没有实际的意义。GreetPeople用于向某人问号,当我们传递代表某人姓名的name参数。比如说"Liker"
    //进去的时候,在这个方法中,将调用EnglishGeeting方法,再次传递name参数,EnglishGreeting则用于向屏幕输出Good Morning ,Liker
    //现在假设这个程序需要进行全球化,再加个中文版的问候方法
    public void ChineseGreeting(string name)
    {
        Debug.Log("早上好," + name);
    }
    //这时候,GreetPeople也需要改一改了,不然如何判断到底用哪个版本的问候方式呢?
    //在进行这个之前,我们最好再定义一个枚举作为判断的依据。
    public enum Language
    {
        English,
        Chinese
    }
    public void GreetPeople(string name, Language lang)
    {
        switch (lang)
        {
            case Language.English:
                EnglishGreeting(name);
                break;
            case Language.Chinese:
                ChineseGreeting(name);
                break;
        }
    }
    //ok,尽管这样解决了问题,但是这个解决方案的可扩展性很差,如果今后我们需要再添加其它语言呢?
    //就不得不反复修改Language和GreetPeople方法,以满足新的需求。
    //在考虑新的解决方案之前,我们先看看GreetPeople的方法签名
    // public void GreetPeople(string name, Language Lang);
    //我们仅看string name ,在这里,string 是参数类型,name 是参数变量,当我们赋值name字符串Liker时,它就代表Liker这个值,
    //当我们赋值它"李志忠"时,它又代表着"李志忠"这个值。然后我们可以在方法体内对这个name进行其他的操作。
    //如果你再仔细想想,假如GreetPeople()方法可以接受一个参数变量,这个变量可以代表另一个方法,当我们给这个变量赋值EnglishGreeting的时候,它代表着EnglishGreeting()
    //这个方法;当我们给它赋值ChineseGreeting的时候,他又代表着ChineseGreeting()方法。我们将这个参数变量命名为MakeGreeting,那么不是可以如同给name赋值一样,在电泳GreetPeople()
    //方法的时候,给这个MakeGreeting参数也赋上值了。然后我们在方法体内,也可以像使用别的参数移向使用MakeGreeting.
    //但是由于MakeGreeting代表着一个方法,它的使用防事故应该和它被赋值的方法
    //比如ChineseGreeting是一样的,比如:MakeGreeting(name);
    //下边是新的解决方案

    public void GreetingPeople1(string name, GreetingDelegate MakeGreeting)
    {
        MakeGreeting(name );
    }
    //如你所见,委托GreetingPeople出现的位置与string相同,string是一个类型,那么GreetingPeople也应该是一个类型,
    //或者叫做类(Class)。但是委托的声明方式过和类却完全不同,这是怎么一回事?事实上,委托在编译的时候会编译成类,因为Delegate是
    //一个类,所以在任何可以声明类的地方都可以声明委托。

    
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值