Class Scala-共同性状的第二代遗传

Class Scala-共同性状的第二代遗传,class,scala,inheritance,traits,Class,Scala,Inheritance,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

如果我在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 */ }

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

我相信,本章可以帮助您理解特质线性化过程:

根据tenshi的建议,在Scala编程一章中,我们有以下示例:

class Animal 
trait Furry extends Animal
trait HasLegs extends Animal
trait FourLegged extends HasLegs
class Cat extends Animal with Furry with FourLegged
E -> D -> C -> B -> A 
其衍生至以下管道:

Cat -> FourLegged -> HasLegs -> Furry -> Animal 
所以右边的人有优先权,但他的祖先,只要他们不是管道上其他人的共同祖先,也有优先权。这就是为什么
hasleegs
出现在
Furry
之前

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

class Animal 
trait Furry extends Animal
trait HasLegs extends Animal
trait FourLegged extends HasLegs
class Cat extends Animal with Furry with FourLegged
E -> D -> C -> B -> A 

那么,这里看起来是同一个变量的东西,将通过在继承指令中最左边的变量后面加上更右边的变量来线性化?