Traits vs. Interfaces vs. Mixins?

ams*_*ams 23 ruby oop programming-languages scala

特征,混合和界面之间有什么相似之处和不同之处.我试图更深入地理解这些概念,但我不知道足够的编程语言来实现这些功能,以真正理解相似之处和不同之处.

对于每个特征,mixins和接口

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

Fed*_*can 10

Java中的每个引用类型除外Object,都源自一个超类.

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

一般来说,接口是描述实现类被强制使用的方法的契约,但不直接提供实现.

换句话说,Java类必须遵守其合同,从而为其声明要实现的接口提供的方法签名提供实现.

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

这为几种抽象模式设置了基础,例如,依赖注入.

Scala本身具有特征.Traits为您提供Java接口的所有功能,它们的重要区别在于它们可以包含方法实现和变量.Traits只是一次实现方法的智能方法 - 通过这种方式 - 将这些方法分配到所有扩展特征的类中.与Java类的接口类似,您可以将多个特征混合到Scala类中.

但是,由于我没有Ruby背景,我将引导您阅读David Pollak的"Beginning Scala"(亚马逊链接)的摘录:

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

接口可以比本文中描述的更多; 由于主题可能非常广泛,我建议您在三个方向中的每个方向进行更多调查,而如果您甚至拥有Java背景,Scala以及因此可以负担得起的特性.