【问题标题】:Inheriting a trait twice继承一个特质两次
【发布时间】:2011-08-29 13:31:11
【问题描述】:

这不起作用:

trait Trait
class Class extends Trait with Trait

编译器抱怨:

<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                           ^
<console>:8: error: trait Trait is inherited twice
       class Class extends Trait with Trait
                                      ^

这样做:

trait Trait
class Abstraction extends Trait
class Implementation extends Abstraction with Trait

问题:

  • 为什么有效?
  • 第二个 sn-p 有何不同? (关于双重继承问题)
  • 第二个 sn-p 或模式是否有用?

【问题讨论】:

  • 你有一个实际的例子,第一个不起作用是一个真正的问题吗?
  • 这个问题的目的不是找出为什么第一个不起作用,而是找出第二个为什么起作用。
  • 有用的链接:chapter from Programming in Scala 展示了线性化的工作原理。

标签: scala inheritance linearization


【解决方案1】:

第二个 sn-p 由于特征线性化而起作用。编译器会将特征组织成一个线性列表,以便Trait 只出现一次。我认为线性化是

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

请参阅 Programming Scala 中的 this chapter 以获得很好的解释。

这样做主要是为了对菱形继承问题采用一致的方法,并且在这种情况下很有用。

由于Trait在线性化后不能出现两次,所以写Trait with Trait没有意义,被禁止也有意义。

【讨论】:

  • 答案很老,所以也许 scala 改变了这种行为,但对我来说,现在看起来这是错误的。线性化应该是:实现、抽象、特征、...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2015-12-07
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2017-12-27
相关资源
最近更新 更多