19

这不起作用:

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

问题:

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

1 回答 1

20

由于特征线性化,第二个片段有效。编译器会将特征组织成一个线性列表,以便Trait只出现一次。我认为线性化是

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any

请参阅Programming Scala 中的这一章以获得很好的解释。

这主要是为了对钻石继承问题采取一致的方法,在这种情况下很有用。

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

于 2011-08-29T13:39:29.307 回答