【问题标题】:Difference between passing a delegate and an interface?传递委托和接口之间的区别?
【发布时间】:2015-02-21 10:32:22
【问题描述】:

传递委托和传递接口到方法之间有什么主要区别吗?我将 c# 委托视为“方法接口”。从这个角度来看,传递一个委托和只用一个方法传递一个瘦接口没有区别。我尝试制作小型接口 (SRP),因此我一直认为委托有些多余。但是我错过了什么吗?

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

    委托确实可以被视为单个方法的接口/契约,因此类似于接口。它们之间的主要区别在于语言语法,尤其是对匿名方法和(自 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;
       }
    });
    

    因此,如果您要跳入匿名方法的兔子洞,那么使用委托会更有意义,因为您只处理方法接口,而没有围绕它的类接口.

    【讨论】:

    • 特别是,C# 采用了这种特殊的方法(与 Java 中的匿名类方法相反),因此您必须在您不想使用的地方使用委托必须创建一个全新的命名类型。 C# 的委托类型推断使委托的使用非常简单和流畅,使其成为适当的接口的优越选择。
    【解决方案2】:

    单方法接口与委托的功能几乎相同。当然,对于要传递的每个“方法”,您都需要一个派生类。

    从实现的角度来看,两者非常相似。委托存储一个函数指针。接口对象引用在它的 vtable 中有一个函数指针。

    我相信a recent Java version implements lambdas with single-method interfaces

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多