文章标题

在这里写一点在这次学习委托过程中的总结:

  • 增加了代码的可拓展性,避免在方法内部去进行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);
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值