传递委托和接口之间的区别?

Difference between passing a delegate and an interface?

传递委托和传递接口给方法有什么主要区别吗?我将 c# 委托视为 "method interface"。从这个角度来看,传递一个委托和传递一个只有一个方法的瘦接口没有区别。我尝试制作小型接口(SRP),所以我一直认为委托有些多余。但是我错过了什么吗?

单一方法接口在功能上与委托几乎相同。当然,对于每个要传递的 "method",您都需要一个派生的 class。

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

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

确实,委托可以被视为单个方法的 interfaces/contracts,因此类似于接口。它们之间的主要区别在于语言语法,尤其是对匿名方法和(自 C# 3.0 起)lambda 的支持。

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

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));

对比

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

因此,如果您跳入匿名方法的兔子洞,使用委托更有意义,因为您处理的是 方法接口,没有class 界面乱七八糟。