传递委托和接口之间的区别?
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 界面乱七八糟。
传递委托和传递接口给方法有什么主要区别吗?我将 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 界面乱七八糟。