转载

利用接口去理解委托

开始使用C#中的委托时,有时会很难理解它的真正的含义,在使用时就会感觉不知道怎么使用它,其实最主要的还是不大明白它的机制, 或者说它的使用场景,首先解释下委托,字面意思就知道它就是一个代理,一个委托,它是谁的代理呢,方法的代理。看下面的代码:

利用接口去理解委托

上面的代码就是定义一个委托来表示一类方法,使用一个字符串参数并无返回的一个方法, 只要满足这种签名的方法都可以用PrintLine委托实现方法的间接调用。下面自定义一个委托,结果是一样的,但是调用的方法不一样。

利用接口去理解委托

至于委托的底层实现, 可以参考FrameWork的源码,就不展开了,今天我要讲得是另外一种方法用实现不用委托的这种方法,像java里面就没有委托这个概念的,哪它是怎么实现的呢、可以通过接口来实现:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace Delegate {     interface Interface1     {         void PrintLine(string str);     } }

上面定义接口,让不同的实现接口的类实现多态,从而可以间接去调用。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate {  public class Class1 : Interface1  {   public void PrintLine(string str)   {    Console.WriteLine(str);   }  } } 
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Delegate {  class Class2 : Interface1  {   static void WriteLine(string str)   {    Console.WriteLine(str);   }   public void PrintLine(string str)   {    WriteLine(str + "cc");   }  } } 

下面是不同的类调用,从而可以实现多态,是不是类似委托:

利用接口去理解委托

通过接口同样可以实现委托那样的效果,但是却比较麻烦,要定义接口,然后实现接口的类重写接口方法,显然委托比较简洁,但是背后是微软帮我们封装了方法调用,实际上也就是封装了类的实例引用和方法指针引用,如   Interface1 cls1 = new Class1();cls1.PrintLine("Test");编译器要知道的是哪个类重写了Interface1接口中的PrintLine方法,因为new  Class1(),所以它就就只调用Class1的实例的PrintLine方法,而委托则把这个对象实例的引用封装起来,存储在Delegate类的的一个_target字段中,从而可以引用各种不同的对象实现,而方法存储在另外一个_methodPtr字段中,从而可以存储不同的方法,但是前提是方法签名相同。然后还可以定义一个数组存储多个委托,从而达到多播委托的效果。

利用接口去理解委托

不知道上面这样解释有没有对你有更好的理解,欢迎补充与建议

正文到此结束
Loading...