Scala - 第二代继承的共同特征

non*_*com 2 inheritance scala class traits

如果我在Scala中有以下代码:

trait A {
  var yo = 10
  def get = yo
}

trait B extends A { /* makes use of A.get */ }
trait C extends A { /* makes use of A.get */ }

trait D extends B with C { /* makes use of A.get */ }

class E extends D { /* makes use of A.get */ }
Run Code Online (Sandbox Code Playgroud)

编译器如何解决依赖关系?换句话说,它是否理解从两个不同特征B和C继承的特征D和对象E的A特征相关部分必须被视为单一事物,而不是每个遗传情况都重复?无论如何,编译器的想法在那种情况下会是什么样子?

ten*_*shi 5

我相信,Scala编程的这一章可以帮助您理解特征线性化过程:

在Scala中编程 - 12.6为什么不进行多重继承?


Chr*_*che 5

从tenshi建议的Scala编程这一章中,我们有以下示例:

class Animal 
trait Furry extends Animal
trait HasLegs extends Animal
trait FourLegged extends HasLegs
class Cat extends Animal with Furry with FourLegged
Run Code Online (Sandbox Code Playgroud)

哪个派生到以下管道:

Cat -> FourLegged -> HasLegs -> Furry -> Animal 
Run Code Online (Sandbox Code Playgroud)

所以右边的那个有优先权,但他的祖先,只要他们不是管道上其他人的共同祖先,也有优先权.这就是HasLegs之前的原因Furry.

最后,这是您的特定示例的答案:

E -> D -> C -> B -> A 
Run Code Online (Sandbox Code Playgroud)