这不起作用:

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


问题:


为什么行得通?
第二个片段有何不同? (关于双重继承问题)
第二个片段或样式是否有用?

最佳答案

第二个片段由于特征线性化而起作用。编译器会将这些特征组织到一个线性列表中,这样Trait仅出现一次。我认为线性化是

Implementation, Trait, Abstraction, ScalaObject, AnyRef, Any


有关详细说明,请参见Programming Scala的this chapter

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

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

关于scala - 两次继承特征,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7230808/

10-11 18:19