感谢大家光临我的博客!一起努力、共同进步 --cc--

cang2012

导航

利用接口去理解委托

  开始使用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字段中,从而可以存储不同的方法,但是前提是方法签名相同。然后还可以定义一个数组存储多个委托,从而达到多播委托的效果。

  

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

 

posted on 2015-06-30 00:39  C-x-C  阅读(1982)  评论(1编辑  收藏  举报