对于变量小伙伴们都非常熟悉,我们会将一个值赋给其对应的变量,使用时直接调用变量即可,这样做非常方便。那么对于方法或者叫函数,我们能不能这样去做呢。答案自然是可以的,这就要用到 委托 。通俗来讲就是 类 将自己的 职责 即要做的事情 委托给一个变量,让变量替自己做这件事情。
首先观察下面一段代码:
public void Main(){
string s = "Hello World!";
int i = 8;
}
这是我们非常熟悉的变量赋值语句,分别是将字符串和数字赋给相应类型的变量。需要注意的是并没有现成委托变量让我们赋值,我们需要从声明委托开始!
一、声明委托类型
就像变量一样,一个整型变量可以接收所有整数给他赋值。同理一个委托变量一样可以接收所有与其相同格式的方法给他赋值,所以我们第一步要做的就是要找到这一类方法的共同点。
小伙伴们可以观察下面的一段代码,试着找出这些方法的异同:
public class MyClass{
public void Fun1(){
//...
}
public int Fun2(){
//...
return 0;
}
public void Fun3(int i){
//...
}
public int Fun4(int i){
//...
return i;
}
public void Fun5(string s){
//...
}
public void Fun6(int i){
//...
}
}
查找方法的异同,无非观察其 返回值 、参数种类 以及 参数数量 而已。观察上面的代码我们可以发现:
Fun1 是无返回值、无参数的方法。
Fun2 是有int返回值、无参数的方法。
Fun3 是无返回值、有int参数的方法。
Fun4 是有int返回值、有int参数的方法。
Fun5 是无返回值、有string参数的方法。
Fun6 是无返回值、有int参数的方法。
由此可以知道 Fun3,Fun6 是同一类方法,因为他们具有相同的返回值类型即无返回值,以及相同的参数类型即int参数。而其他几个方法互不相同。如果我们要给这些方法全部声明委托变量,则需要声明5个委托变量,Fun3 和 Fun6 为同一类型方法,可以使用同一个委托,而其余方法则需要不同的委托接收它们赋值。
通过以上分析,小伙伴们可以开始声明委托!
注意:
声明委托类型的关键字为 delegate 且分别要具备返回值类型和参数类型!
public delegate void Del1();
public delegate int Del2();
public delegate void Del3(int i);
public delegate int Del4(int i);
public delegate void Del5(string s);
public class MyClass{
...
}
这样我们就把五个委托类型声明好了。其中:
Del1 对应无返回值、无参数的方法。
Del2 对应有int返回值、无参数的方法。
Del3 对应无返回值、有int参数的方法。
Del4 对应有int返回值、有int参数的方法。
Del5 对应无返回值、有string参数的方法。
到这里,我们的委托类型声明就完成啦!不过在实际应用中并不需要我们把这些所有的方法对应的委托类型都写出来,只需要我们声明需要用到委托类型即可。下一步就可以声明委托变量啦!
二、声明委托变量
小伙伴们在学习java时一定知道,当我们声明变量时,一般都是这样写的,首先在类中声明成员变量,然后在方法中给成员变量赋值。代码如下:
public class MyClass{
String s;
public void Main(){
s = "Hello World!";
}
}
委托变量的声明与使用与普通变量的使用方式是一样的,代码如下:
//声明委托类型
public delegate void Del1();
public class MyClass{
//声明委托变量
Del1 del1;
public void Main(){
//给委托变量赋值
del1 = Fun1;
}
public void Fun1(){
//...
}
}
经过以上操作,我们就成功的把Fun1方法赋给了与其类型相一致的委托变量。小伙伴们在使用时只需要在方法中调用赋值好的委托变量就可以啦!代码如下:
//声明委托类型
public delegate void Del1();
public class MyClass{
//声明委托变量
Del1 del1;
public void Main(){
//给委托变量赋值
del1 = Fun1;
}
public void Fun1(){
//...
}
public void OtherFun(){
del1(); //调用委托变量执行Fun1方法
}
}
三、委托的使用场景
经过之前的操作,我们已经成功将一个方法赋给了委托变量,可是小伙伴们一定会想,这样做意义何在,我不能直接在OtherFun方法中调用Fun1方法吗?答案当然是可以。只是委托有适合他自己的使用场景。它一般使用在:
-
窗体之间相互调用方法:如果Form2需要调用Form1中的某个方法,就可以使用委托进行传参,当然委托传递的参数就是方法了,这样Form2得到了Form1传来的方法后,自然就可以在Form2中使用Form1的方法啦!
-
回调方法:作为参数传入另一个方法,并在该方法内被调用,用以来完成某些任务,这样的方法称为 回调方法 也叫 回调函数。
-
Windows窗体开发中的事件:小伙伴们接触最多的Windows窗体开发中经常会使用到点击事件,这个事件实际上就是一种委托,我们称之为多播委托,这种开发模式我们也称之为 观察者模式 。即当执行某一动作时自动触发相应事件的方式。
总之委托大多被用于把方法当作变量一样传递到其他方法或类中,小伙伴们在未来的学习中会经常与委托打交道,到那时就能清楚的了解委托的意义所在了!
关于委托我们就介绍到这里。这次只是介绍了委托最基本的知识点,便于小伙伴们理解使用。其实委托还又其他更多的用法,在这里就不多做介绍了,说的太深也不便于小伙伴们理解,当我们了解了其基本知识与原理后再去深入探索这些问题就不再是难事了!


