【发布时间】:2015-02-21 10:32:22
【问题描述】:
传递委托和传递接口到方法之间有什么主要区别吗?我将 c# 委托视为“方法接口”。从这个角度来看,传递一个委托和只用一个方法传递一个瘦接口没有区别。我尝试制作小型接口 (SRP),因此我一直认为委托有些多余。但是我错过了什么吗?
【问题讨论】:
传递委托和传递接口到方法之间有什么主要区别吗?我将 c# 委托视为“方法接口”。从这个角度来看,传递一个委托和只用一个方法传递一个瘦接口没有区别。我尝试制作小型接口 (SRP),因此我一直认为委托有些多余。但是我错过了什么吗?
【问题讨论】:
委托确实可以被视为单个方法的接口/契约,因此类似于接口。它们之间的主要区别在于语言语法,尤其是对匿名方法和(自 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));
对比
Item item = myList.FindBySelector(new ISelector ()
{
@Override
public boolean apply(Item item)
{
return item.IsTheOne;
}
});
因此,如果您要跳入匿名方法的兔子洞,那么使用委托会更有意义,因为您只处理方法接口,而没有围绕它的类接口.
【讨论】:
单方法接口与委托的功能几乎相同。当然,对于要传递的每个“方法”,您都需要一个派生类。
从实现的角度来看,两者非常相似。委托存储一个函数指针。接口对象引用在它的 vtable 中有一个函数指针。
我相信a recent Java version implements lambdas with single-method interfaces。
【讨论】: