在这里写一点在这次学习委托过程中的总结:
- 增加了代码的可拓展性,避免在方法内部去进行switch的判断决定运行时执行哪个具体的方法
现在有这样一个简单的场景,需要向人问好,使用控制台打印问候
public void GreetPeople(string name)
{
EnglishGreeting(name);
}
publish void EnglishGreeting(string name)
{
Console.WriteLine(“Good Morning,”+name);
}
这样,当前传入一个名字,比如Lewis,则会打印“Good Morning,Lewis”,但是现在我们需要扩大使用场景,使用更多的语言,那该怎么办?添加更多的方法,比如加入一个中文版的问候
public void ChineseGreet(string name)
{
Console.WriteLine(“早上好,”+name);
}
现在有了中文的问候了,可是应该如何判断该使用哪一个版本的语言呢,Switch?可行,开搞开搞
public void GreetPeople(string name, strin language){
swith(language){
case English:
EnglishGreeting(name);
break;
case Chinese:
ChineseGreeting(name);
break;
}
}
现在可以通过switch选择具体的语言了,可是如果以后需要添加更多的方法,那就需要修改switch,这样拓展性很差,而且会产生一个非常庞大的switch语句。
所以,怎么解决,让这段代码更加的优雅。这样考虑:当我给name这个参数传值Lewis后,我在方法内部就可以进行操作,比如我把它打印了出来,那么是不是说我如果传入一个方法1,那么就可以在这个方法2的内部使用我传入的方法1了?既然变量可以这样做,那么方法应该也是可以的。
public void GreetPeople(string methodName, ?? MakeGreeting)
{
MakeGreeting( methodName )
}
??是什么,methodName的前面是string,表示他是一个string类型,我这里Makegreeting是一个方法,所以我需要表示一下这个方法的类型,这咋写,超出认知范围了啊。那么就找,怎么表示一个方法的类型,去哪儿找啊,下面啊。。。。。。
- 委托定义了方法的类型
//定义委托
pulic delegate void GreetingDelegate(string name);
//待解决的问题, ??如何表示
public void GreetPeople(string methodName, ?? MakeGreeting)
//解决方案, ?? =GreetingDelegate
public void GreetPeople(string methodName ,GreetingDelegate MakeGreeting)
//调用的方法
public void EnglishGreeting(string name)
在这第二行代码中,string代表了name这个参数的类型,而如何表示一个方法的类型呢,这时候就需要使用委托,第一行 GreetingDelegate 定义了 MakeGreeting 的参数类型,也就是方法的类型。再看看第四行,这是我们需要使用到的方法,我们在GreetPeople的参数中想要传递的就是他,而为了传递他我们定义个 GreetingDelegate这个委托变量,仔细对比,参数一样的对不对, 我们就是参照这个需要具体调用的方法通过delegate把他定义成了委托而已。
- 完整代码
namespace Delegate{
pulic delegate void GreetingDelegate(string name);
class Program
{
static void Main(string args[])
{
GreetingManager myGreet = new GreetingManager();
/*单个方法的绑定
myGreet.GreetPeople(“Lewis”,EnglishGreeting);
myGreet.GreetPeople(“刘翔”, ChineseGreeting);
*/
/*委托封装到类的写法
myGreet.myDelegate = EnglishGreeting;
myGreet.myDelegate = ChineseGreeting;
myGreet.GreetPeople(“Lewis”, myGreet.myDelegate);
*/
Console.ReadKey();
}
}
public void EnglishGreeting(string name)
{
Console.WriteLine(“Good morning,”+name);
}
public void ChineseGreet(string name)
{
Console.WriteLine(“早上好,”+name);
}
}
GreetingManage类
public class GreetingManager
{
public GreetingDelegate myDelegate;
public void GreetPeople(string name,GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
}
- 多播委托
通过+=和-=绑定方法和取消绑定,这样将多个方法绑定到同一个委托变量,在调用时会依次调用所有的绑定方法。
注意需要先使用=进行初始化,不然报错 “使用了未赋值的局部变量“。
多播委托代码
GreetingManager myGreet = new GreetingManager();
/*多个方法绑定到委托变量
GreetingDelegate multiDelegate;
multiDelegate = EnglishGreeting;
multiDelegate += ChineseGreeting;
myGreet.GreetPeople(“Lewis”,multiDelegate);
*/