利用接口去理解委托

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

  

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

时间: 2024-10-26 02:24:29

利用接口去理解委托的相关文章

没有代码也让你理解委托的作用

假如我们现在有个机器人,它有一个功能或者叫作方法,叫做dosomething(),然后我们在里面写实现代码,例如快过年了,就写拜年的方法 ,OK,然后过年的时候它就会向大家拜年了,现在到这里还是很正常的,但是新年过去了之后呢?拜年这个方法也就不用使用了, 这个时候我们就需要机器人干其他事情了,不可能买一个机器人就只是为了拜年吧?我现在想要机器人扫地,所以我们就需要修改 dosomething这个方法了,那怎么修改了,我想应该是修改代码之后再植入到机器人的芯片吧!但是这样的操作方法是违反了开封 闭

C#委托的定义 以及使用方式详解,更简单的理解委托。

委托的声明及定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性.“ 这是百度上和许多教科书上都有的一个概念,但是初学这门编程语言的话,或者基础比较差的童鞋,看到这句话,肯定是一脸懵比,先不用着急,我们来慢慢通过代码去理解委托这个概念. 下面就在C#控制台上看代码把 相信刚学C#的朋友们应该很熟悉 using System;using Sy

换种思路去理解设计模式(下)

开写之前,先把前两部分的链接贴上.要看此篇,不许按顺序看完前两部分,因为这本来就是一篇文章,只不过内容较多,分开写的. 换种思路去理解设计模式(上) 换种思路去理解设计模式(中) 8       对象行为与操作对象 8.1     过程描述 所谓对象行为和操作对象,需要三方面内容: l  操作过程: 一般表现为一个方法.该方法接收一个对象或者组合类型的参数,然后对这个对象或者组合进行操作,例如修改属性.状态或者结构等. l  操作的对象或组合: 会作为实参传入操作过程,会被操作过程修改属性.状态

C#学习之初步理解委托、事件、匿名方法和Lambda

最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对,请大家多多指教! 第一部分:理解委托 委托委托,顾名思义,就是类似于中间人的意思,有些事情你不做,委托别人去做,比如你想相亲,但你不想去主动约女孩子,那你可以交给媒婆去帮你约. 如果你学过C++,请把委托理解成函数指针,都是为了调用函数.函数指针可以调用符合该函数指针要求的函数.什么叫符合该函数指

从需求的角度去理解Linux系列:总线、设备和驱动

笔者成为博客专家后整理以前原创的嵌入式Linux系列博文,现推出以让更多的读者受益. <从需求的角度去理解linux系列:总线.设备和驱动>是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇,期待此系列文章日后会是学习嵌入式Linux的标杆! 这是作者精心撰写的经验总结,希望嵌入式Linux的学习者仔细领会,多读几遍也无妨. 一.软件.面向对象.软件框架 软件是为了解决现实问题而产生的,面向对象的软件思维是解决普遍现实问题的一种有效的抽象方法,而

从需求的角度去理解Linux之一:总线、设备和驱动

这是一篇有关如何学习嵌入式Linux系统的方法论文章,也是从需求的角度去理解Linux系统软件的开篇,相信此系列文章日后会是学习嵌入式Linux的标杆! 这是作者精心撰写的经验总结,希望嵌入式Linux的学习者仔细领会,多读几遍也无妨. 转载请务必保留我们的公众号:嵌入式企鹅圈 一.软件.面向对象.软件框架 软件是为了解决现实问题而产生的,面向对象的软件思维是解决普遍现实问题的一种有效的抽象方法,而软件框架指的是用面向对象的思维去解决某种特定领域的问题而专门设计的一套行之有效的解决方案. 一般地

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

按自己的想法去理解事件和泛型(C#)

上一篇那些年困扰我们的委托(C#)讲了委托,这一篇自然就轮到事件了. 不喜欢官方的表达方式,喜欢按照自己的想法去理解一些抽象的东西,我是一个喜欢简单怕麻烦的人. 事件 考虑到委托使用的一些缺陷,就有了事件.委托是不安全的,打个比方,如果把委托当作共有字段,那么事件就相当于是属性的概念. 事件就是被限制使用的委托变量,事件里面封装了一个多播委托. 事件语法:public event 委托类型 事件名; 事件的作用:事件的作用与委托变量一样,只是功能上比委托变量有更多的限制.比如:只能通过+=或者-

从认知角度去理解设计

设计并不是一味只求美感或者感觉,设计同样是一门建立在多学科基础上的科学,从认知角度来理解设计能帮助我们设计出更多尊重用户的作品,这样的设计才能经得起时间的考验,让更多用户所喜爱. 下面是我对<认知与设计——理解ui设计准则>这本书的概要与理解. 一.影响我们感知的因素     a. 经验影响感知: 我们根据经验对事物的预想:先入为主的主观印象往往影响感知,当我们带有    不同的主观感受去观察同一张图片时会看到不同的东西 我们的认知框架:认知框架即是不断置身的各种环境在我们心智中建立起开模式,