【发布时间】:2016-08-12 10:57:09
【问题描述】:
我试图在 scala 的上下文中理解 Mixins。特别是我想知道继承和 Mixins 概念之间的区别。
wiki 中 Mixin 的定义说:
mixin 类充当父类,包含所需的功能。然后子类可以继承或简单地重用此功能,但不能作为专门化的手段。通常,mixin 会将所需的功能导出到子类,而不会创建严格的、单一的“是”关系。这就是 mixins 和继承概念之间的重要区别,子类仍然可以继承父类的所有特性,但是,关于子类“是一种”父类的语义不必是必须应用。
在上述定义中,我无法理解以粗体标记的陈述。这是什么意思
- 子类可以继承 mixin 中的功能,但不能作为特化的手段
- 在 mixins 中,子类继承了父类的所有特性,但是关于子类“成为一种”父类的语义不一定要应用。 - 孩子如何扩展父母而不一定是父母?有没有这样的例子。
【问题讨论】:
-
在 Scala 中,将 Mixins 视为一种简洁的编译时转换,它将用额外的方法装饰某些类型。在这种情况下,虽然 Scala 为类型检查器跟踪“混合类型”,但方法定义本身被扁平化为实际类型,因此在 JVM 类中没有建立父子对象。继承通常与运行时多态方法解析相关联 - 但 mixin (很大程度上)是正交概念。 Java 8 接口默认方法也是 mixins。
-
这个问题似乎是asked before in a broader context(虽然我对那里的答案并不完全满意)。
-
在 [Scala 编程,第 3 版][1] 第 12 章 Traits 一书中有一个很长的答案描述器