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

cang2012

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

利用接口去理解委托

  开始使用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   C-x-C  阅读(1992)  评论(1编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示