Traits vs. Interfaces vs. Mixins?

Posted

技术标签:

【中文标题】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”也可能有用。 【参考方案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

以上是关于Traits vs. Interfaces vs. Mixins?的主要内容,如果未能解决你的问题,请参考以下文章

[TypeScript] Typescript Interfaces vs Aliases Union & Intersection Types

用vs2010编译cegui时,CEGUICoronaImageCodec项出错

Windows + VS2019 + CMake + CLion + Conan:如何启用C++20?

VS2019连接Linux

Groovy 中@Delegate、@Mixin 和 Traits 之间的区别?

c++ char_traits模板类的实现!!!