委托和接口如何互换使用?
Posted
技术标签:
【中文标题】委托和接口如何互换使用?【英文标题】:How can a delegate & interface be used interchangeably? 【发布时间】:2011-01-01 23:54:52 【问题描述】:我可以使用接口方法代替委托吗?如何?我发现搜索接口方法比使用委托更快。我会很感激一个简单的代码 sn-p。
【问题讨论】:
你在说什么?接口和委托的语义完全不同,所以你是使用 A 还是 B,取决于具体情况。 @Frederik:这里不欢迎带有这种粗糙度的评论。 SO 是一个更专业的地方,适合各种技术知识和能力的人获得帮助。 @Samir:我同意 Mitch 的观点,您提出了 25 个问题,是时候接受其中的一些了。 为问题添加一些上下文会很好。您要优化的具体问题是什么?还是这是一个普遍的问题? 这就是 java ppl 所做的。你可以看到***.com/questions/44912/java-delegates 【参考方案1】:理论上,可以通过包含单个方法的接口(例如,Java 没有委托)的委托来完成所有事情。但是,它使代码更加冗长并且几乎没有什么好处。再说一次,可以在没有课程的情况下做所有事情,并且可能做得更快。这并不意味着您应该避免使用类。调用委托方法可能略微比调用接口方法慢。你不应该关心微优化。使用适合您特定需求的任何内容。
【讨论】:
【参考方案2】:参考Delegates Are Anonymous Interfaces by Mark Seemann
在上面的文章中,Mark Seemann 提到了一个例子
接口方法
public interface IMyInterface
int DoIt(string message);
public string DoStuff(IMyInterface strategy)
return strategy.DoIt("Ploeh").ToString();
委托方法
public string DoStuff(Func<string, int> strategy)
return strategy("Ploeh").ToString();
【讨论】:
【参考方案3】:使用委托而不是接口的最大优点是,虽然一个类只能为任何给定接口提供一种实现,但它可以为任意数量的不同方法创建委托。例如,假设 Button 没有公开 Click 事件,而是公开了 IButtonClickHandler 类型的 ClickRecipient 属性,其中一个方法是“ButtonClick”。具有两个按钮的表单应该具有不同的处理程序,因此必须定义一个单独的类来处理其中至少一个,因为表单本身只能具有 ButtonClick 的一个实现。相比之下,Button 事件接受 EventHandler 的委托,而表单可以为任意数量的 EventHandler 方法创建委托。
请注意,使用泛型和“标记类型”可以显着缓解此问题,方法是让 Button(Of T) 具有 IButtonClickHandler(Of T) 类型的 ClickRecipientProperty;因此,一个表单可以有一个 Button(Of FooButton) 和一个 Button(Of BarButton) 并为它们的接口提供不同的实现。还可以有一个 ButtonConverter(Of T,U) 包装类,它将实现 IButtonClickHandler(Of T) 并调用 IButtonClickHandler(Of U).ButtonClick。
如果使用模式在 99% 的情况下与接口的设计用途相匹配(剩余 1% 的时间,可以创建中间包装类),则接口是好的。
【讨论】:
以上是关于委托和接口如何互换使用?的主要内容,如果未能解决你的问题,请参考以下文章