【问题标题】:Traits vs. Interfaces vs. Mixins?Traits vs. Interfaces vs. Mixins?
【发布时间】:2013-05-30 05:26:42
【问题描述】:

traits、mixin 和接口之间有什么异同。我正在尝试更深入地了解这些概念,但我对实现这些功能的编程语言了解不多,无法真正理解它们的异同。

对于每个特征、混合和接口

  • 正在解决什么问题?
  • 这个概念的定义在编程语言中是否一致?
  • 它和其他的有什么相似之处?
  • 它和其他的有什么区别?

【问题讨论】:

  • Scala 仅具有特征(混合和接口将包含在特征中)。查看您的个人资料,您似乎有 Java 背景。你应该试试 Scala,你会发现当你想混入一些与你当前类正交的实现时,trait 非常方便。当您想要堆叠特征时,很难做到正确。有关详细信息,请参阅artima.com/pins1ed/traits.html
  • @ams:看看这个answer。即使它被标记为“groovy”也可能有用。

标签: ruby scala oop programming-languages


【解决方案1】:

Java 中的每个reference type,除了Object,都派生自一个超类。

顺便说一下,Java 类可以实现零个或多个接口。

一般来说,接口是描述实现类强制具有的方法的契约,尽管没有直接提供实现。

换句话说,Java 类有义务遵守它的契约,从而实现它声明要实现的接口所提供的方法签名。

一个接口构成一个类型。因此,您可以传递参数并从声明为接口类型的方法中获取返回值,从而要求参数和返回类型实现特定方法,而不必为它们提供具体实现。

这为几种抽象模式奠定了基础,例如,dependency injection

Scala 就其自身而言,具有特征。 Traits 为您提供了 Java 接口的所有特性,其显着区别在于它们可以包含方法实现和变量。 Traits 是一种只实现一次方法的聪明方法,并通过这种方式将这些方法分发到扩展该 trait 的所有类中。 与 Java 类的接口一样,您可以将多个 trait 混合到一个 Scala 类中。

不过,由于我没有 Ruby 背景,我将向您指出 David Pollak 的“Beginning Scala”(amazon link) 的节选:

Ruby 有 mixins,它们是可以混合到任何类中的方法的集合。因为 Ruby 没有静态类型,也没有办法声明方法参数的类型,所以没有合理的方式使用 mixins 来定义类似接口的契约。 Ruby mixin 提供了一种将代码组合到类中的机制,但不提供定义或强制参数类型的机制。

接口可以做的比这篇文章中描述的还要多;由于主题可能很广泛,我建议您在三个方向中的每一个方向上进行更多研究,而如果您甚至具有 Java 背景,Scala 和因此特性是可以学习的。

【讨论】:

  • 您应该澄清每个 reference 类型都派生自 Object。原语没有。我会删除“正如互联网上广泛流传的说法......”这句话或提供一些知名文章的链接。
  • 我不同意 Pollak 的观点,首先“没有合理的方法可以使用 mixins 来定义类似接口的合约”-a contract is primarily about methods,确实如此。其次“不是定义或强制参数类型的机制”——Ruby 使用鸭子类型和方法命名。见this answer for more
猜你喜欢
  • 2010-10-29
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 2012-12-21
  • 1970-01-01
  • 2014-08-17
  • 2011-09-18
相关资源
最近更新 更多