如何代表和界面可以互换使用?

时间:2010-01-06 10:01:01

标签: c# methods interface delegates

我可以使用接口方法代替委托吗?怎么样?我发现搜索接口方法比使用委托更快。我很感激一个简单的代码片段。

3 个答案:

答案 0 :(得分:6)

理论上,可以通过包含单个方法的接口(例如Java没有委托)完成代理所做的所有事情。但是,它使代码更加冗长,并且几乎没有带来任何好处。然后,可以在没有类的情况下完成所有操作,并且可能更快地完成。这并不意味着你应该避免使用类。调用委托方法可能比调用接口方法略微慢。你不应该关心微观优化。使用符合您特定需求的任何东西。

答案 1 :(得分:3)

参考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();
}

答案 2 :(得分:0)

使用委托而不是接口的最大优点是,虽然类只能为任何给定的接口提供一个实现,但它可以为任意数量的不同方法创建委托。例如,假设不是暴露Click事件,Button公开了一个类型为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%,可以创建一个中间包装类),接口就很好。

相关问题