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是
//一个类,所以在任何可以声明类的地方都可以声明委托。
}