【问题标题】: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 所做的。你可以看到stackoverflow.com/questions/44912/java-delegates

标签: c# methods interface 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% 的时间,可以创建中间包装类),则接口是好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2014-08-18
        • 2021-02-20
        • 2020-11-10
        • 1970-01-01
        • 2021-04-15
        相关资源
        最近更新 更多