• 利用接口去理解委托


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

      

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

  • 相关阅读:
    7.22Java之Lambda表达式练习
    7.22Java线程池的使用
    7.20Java之封装multipart/formdata格式的表单并请求API
    7.22Java线程池概念和原理
    7.16Java接口之关于ContentType中application/xwwwformurlencoded和multipart/formdata的区别
    7.22Java之函数式编程思想
    7.23Java之Lambda表达式之省略形式
    7.17Java之HttpClient类发送application/xwwwformurlencoded类型的请求
    7.19Java之HttpClient类发送GET请求方法
    7.16Java之使用HttpClient类
  • 原文地址:https://www.cnblogs.com/cang/p/4609256.html
Copyright © 2020-2023  润新知