委托 与 接口的区别

委托 与 接口的区别

个人总结:

首先,我认为最大的区别在于,我们可以在委托类的对象内,叠加或者删除多个方法;而接口一次只能加载一个方法;

-------------------------------------------------------------------

msdn观点:

C# 编程指南何时使用委托而不使用接口(C# 编程指南)

委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?

在以下情况中使用委托:

  • 当使用事件设计模式时。-一种设计模式

  • 当封装静态方法可取时。-隐藏静态方法;我举个例子:new delegate(静态方法)

  • 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。

  • 需要方便的组合。

  • 当类可能需要该方法的多个实现时。需要一个委托完成多个事情的时候。

在以下情况中使用接口:

  • 当存在一组可能被调用的相关方法时。

  • 当类只需要方法的单个实现时。

  • 当使用接口的类想要将该接口强制转换为其他接口或类类型时。

  • 当正在实现的方法链接到类的类型或标识时:例如比较方法。

------------------------------------------------------------------

其他观点:

我们只讨论接口仅包含方法声明的情况,如果接口包含属性、索引器、事件等,与委托肯定不搭。一个仅包含多个方法声明的接口与多个委托要相互替换,在很多情况下都没有技术问题,只是怎样做更合理的问题。

    相对于委托来说,接口可以声明多个方法,而且接口名称可以很好的表示这些方法的相关性;接口在同一时间只能引入一种实现,也就是说类Client中有接口IUser型的成员,UserA和UserB都实现了IUser,那么在Client中只能调用UserA或者UserB的方法,要想同时调用A和B的方法,需要创建两个IUser型成员。

    相对于接口来说,委托类型只能“声明”一个方法;一个委托实例可以引入任意多个签名适合的方法,并且这些方法的顺序由委托实例所在类的外部决定,也就是说类A中有委托类型B的实例b(也可以是event),那么在Client1、Client2等多个类中都可以给A的实例a的成员b叠加方法,并且顺序由Client1、Clinet2决定。

    从某种意义上可以这样理解:接口给一系列类定义了规范,是面向对象的,但同一时间只能代表其中一个类;委托给一系列方法定义了规范,同一时间可以代表这些方法的任意顺序组合。一个仅包含多个方法的接口,可以拆分成多个委托来代替,这样耦合度更低,但是失去了相关性,面向对象的特性也随之失去。一个类中的多个委托实例也可以改成一个接口来代替,但会失去委托可以叠加任意多方法的灵活性,并且如果多个委托是不相关的,会造成理解困难(接口名称就很难定)。

    当接口只包含一个方法,委托只需叠加一个方法时,两者的作用是一样的。即使在这种场景下,我们也要明确,接口是针对类,委托是针对方法或某个地方发生了某件事,这样就自然会合理运用了。比如说FrameWork类库中,很多类实现了ICloneable接口,很多控件有OnClick事件。

    另外,业务层需要调用表现层的方法时,往往通过提供事件和表现层交互,多线程时还要用Invoke方式调用这个事件。如果业务层提供一个接口让Form实现,总觉得怪怪的,但是微软MVP模式的一种实现方法就是这样的,在P中定义接口让V(WebForm)实现,除了代码重用度提高外,和通常的WebForm做法还是一样的,和MVC有本质区别

-------------------------------------------------------------------

http://hi.baidu.com/jiangyangw3r/item/6237d138abef4649023edc4a

接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。接口(interface)是向客户承诺类或结构体的行为方式的一种合同,当实现某个接口时,相当于告诉可能的客户:“我保证支持这个接口的方法,属性等”,接口不能实例化,接口只包含成员定义,不包含成员的实现,成员的实现需要在继承的类或者结构中实现。
C#中的委托是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为,委托方法的使用可以像其他任何方法一样具有参数和返回值。委托对象能被传递给调用该方法引用的代码而无须知道哪个方法将在编译时被调用。
从定义上来看似乎委托接口没什么相似之处,但从隔离变化这个角度来看他们倒是有些相似之处,所以这里我们把他们放到一起来比较一番。

委托接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?

在以下情况中使用委托

当使用事件设计模式时。委托是事件的基础,当需要某个事件触发外界响应时,使用委托事件比较合适。

当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。

需要方便的组合,使用委托可以利用+=,-=方便的组合方法。

当类可能需要该方法的多个实现时,使用多播委托。(多个事件)

在以下情况中使用接口

当存在一组可能被调用的相关方法时。

当类只需要方法的单个实现时。

当使用接口的类想要将该接口强制转换为其他接口或类类型时。

当正在实现的方法链接到类的类型或标识时:例如比较方法。

使用单一方法接口而不使用委托的一个很好的示例是 IComparable 或 IComparable。IComparable 声明 CompareTo 方法,该方法返回一个整数,以指定相同类型的两个对象之间的小于、等于或大于关系。IComparable 可用作排序算法的基础,虽然将委托比较方法用作排序算法的基础是有效的,但是并不理想。因为进行比较的能力属于类,而比较算法不会在运行时改变,所以单一方法接口是理想

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值