最近在研究委托,在此跟大家分享一下。今天先说说委托是什么以及委托怎么用。
概念:
官方的讲:委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的"类",委托的实例将代表一个具体的函数。
另一种教容易理解的解释:委托是一个类,它定义了方法的类型,使方法可以当作另一个方法的参数来进行传递。
为了让大家更好地理解,我再举个例子:
实例:
public void isontime()//到时间了,该去接孩子了 { Console.WriteLine("妈妈:还没下班,怎么办\n"); }没关系呀,有保姆呢,委托给保姆去做就可以了。
class mother { //声明委托help,即定义了一个方法的类型为 help。 public delegate void help(); //定义了一个help委托类型的事件。也可以理解为委托的实例。 public event help delegation; public void istime()//到时间了,该去接孩子了 { Console.WriteLine("妈妈:时间到了,该去接孩子了\n"); //委托给保姆 delegation(); } }保姆类:
class nurse { public void getorder()//收到命令 { Console.WriteLine("保姆:收到"); Console.WriteLine("保姆:孩子接回来了\n"); } }那妈妈怎么告诉保姆去接孩子呢?其实很好说,保姆本就有接孩子的职责,所以只需要妈妈说一声到时间了就可以了。
class main { static void Main(string[] args) { //实例化 mother mom= new mother(); nurse nur=new nurse(); nurses nurs = new nurses(); //将保姆的方法注册到妈妈 mom.delegation += new mother.help(nur.getorder); //妈妈:时间到了 mom.istime(); Console.Read(); } }
结果:
这就是委托,和生活中委托的意思很相近。
现在再来理解关于委托的官方解释,应该就不难了:委托就是一种引用方法的类型:
public delegate void help();定义了一个方法的类型,即方法的类型为help。把方法当做参数传递的时候可以这样:function(help function1);
一旦为委托分配了方法,委托将与该方法具有完全相同的行为
如上面的例子:mom.delegation += new mother.help(nur.getorder); 给委托delegation分配了getorder方法,之后delegation(),就相当于getorder();
下面再借上面的例子说说使用委托的流程:
流程:
该委托是用到事件的:
1.声明一个委托:
public delegate void help();
2.声明一个事件:
public event help delegation;
3.将被委托的方法注册到事件:
mom.delegation += new mother.help(nur.getorder); //+=是注册,-=是注销
4.触发需要委托的方法:
mom.istime();
5.需要委托的方法中有事件的触发
public void istime()//到时间了,该去接孩子了
{
Console.WriteLine("妈妈:时间到了,该去接孩子了\n");
//委托给保姆
delegation();
}
6.而事件中注册了被委托的方法,所以被委托的方法被执行
public void getorder()//不用担心
{
Console.WriteLine("保姆:收到");
Console.WriteLine("保姆:孩子接回来了\n");
}
总结:
面向对象的思想:职责分明。自己不用做的事,就委托给该干这事的人。
通过委托,实现了mother和nurse之间的解耦。即mother要用nurse的方法,但没有直接调用。
提高了代码的可扩展性,如果此时mother还有别的事情,如要买菜,就可以把买菜委托给另一个nurse,这时,只需要再添加一个nurse类,里面写上买菜的方法,在主方法中将买菜注册到委托的事件中。就可以实现委托另一个nurse去买菜了。整个过程不会对原有程序进行任何改动。所以使用委托,提高了程序的可扩展性。