传递委托和界面之间的区别?

时间:2015-02-21 10:32:23

标签: c# delegates

传递委托和将接口传递给方法之间是否存在重大差异?我将c#delegate视为"方法界面"。从这个角度来看,传递委托和仅使用一个方法传递瘦接口之间没有区别。我尝试制作小型接口(SRP),所以我总是认为委托有些多余。但我错过了什么吗?

2 个答案:

答案 0 :(得分:5)

实际上,代理可以被视为单个方法的接口/契约,因此类似于接口。它们之间的主要区别在于语言语法,特别是对匿名方法的支持和(自C#3.0以来)lambdas。

如果您要为所有接口和委托创建显式的命名实现,那么您的代码看起来非常相似:

var item = myList.FindBySelector(SelectorMethod); // delegate-based;
var item = myList.FindBySelector(new MySelectorImpl()); // interface-based.

但是,如果你要使用匿名类型,它可能会让接口变得更加混乱 - 请考虑这个来自C#的示例与来自Java 7的示例,后者支持匿名类型但不支持匿名方法:

var item = myList.FindBySelector(new SelectorDelegate(item => item.IsTheOne));

VS

Item item = myList.FindBySelector(new ISelector () 
{
   @Override
   public boolean apply(Item item) 
   {
       return item.IsTheOne;
   }
});

因此,如果您正在跳过匿名方法的漏洞,使用委托会更有意义,因为您只处理 方法接口,而没有类接口围绕它

答案 1 :(得分:2)

单方法接口与委托的功能几乎完全相同。当然,每个"方法需要一个派生类"你希望通过。

从实施的角度来看,两者非常相似。委托存储函数指针。接口对象引用在其中有一个函数指针。

我相信a recent Java version implements lambdas with single-method interfaces