其实研究了半天,最后发现其实不管什么最终的目的就是解耦和,可扩展。
对于委托来说,用一句最直接的话来说,就是代替了if-else(switch)语句。举例:
class Program { //定义一个枚举,作为判断的依据 public enum Language { English, Chinese } //两种语言问候的方法 public void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public void ChineseGreeting(string name) { Console.WriteLine("早上好 ," + name); } //GreetPeople执行选择语言的方法 public void GreetPeople(string name, Language lang) { switch (lang) { case Language.English: EnglishGreeting(name); break; case Language.Chinese: ChineseGreeting(name); break; } }
主函数:
//主函数显示问候语 static void Main(string[] args) { GreetPeople("huohuo", EnglishGreeting); GreetPeople("霍霍", ChineseGreeting); Console.ReadKey();
而当我们再加几种语言的问候语的时候,为了避免循环语句的出现,以及对枚举类型改动
违背的原则:OOP中的OCP(对扩展开放,对修改关闭)原则。于是:
我们引用了“委托”的概念,对于上个问候的小例子,我们可以这样来考虑:
增加一个GreetingManager来封装一下:
//定义委托,它定义了可以代表的方法的类型。 public delegate void GreetingDelegate(string name); public class GreetingManager { public GreetingDelegate delegate1; public void GreetPeople(string name) { if (delegate1 != null) { delegate1(name); //MakeGreeting(name); } }
对于委托是用静态方法来修饰的:
public static void EnglishGreeting(string name) { Console.WriteLine("Morning, " + name); } public static void ChineseGreeting(string name) { Console.WriteLine("早上好 ," + name); }
主函数直接调用的结果:
GreetingManager gm = new GreetingManager(); gm.delegate1 = EnglishGreeting; gm.delegate1 += ChineseGreeting; gm.GreetPeople("huohuo");
例子看完了,现在我们来了解一下,
什么是委托?
- 委托是一个类,它定义了方法的类型,使得可以将方法作为一个方法的参数来进行传递(也就是将方法作为方法的参数);
- 类是对象的抽象,而委托是函数的抽象;
- 一个委托代表了具有相同参数列表和返回值的所有函数;
为什么要用委托?
- 相当于用方法作为另一方法参数,避免在程序中大量的使用If-else(Switch)语句,也就是刚开始所列举的例子;
- 使程序具有更好的可扩展性,满足OCP原则;
- 在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托;
对于委托,其实也只是了解的这点而已,好处也只是明白了前两点,对于第三点的实践等待验证。
时间: 2024-10-10 17:03:41