2012-02-22 58 views
2

如果我在斯卡拉以下代码:斯卡拉 - 一个共同的特点的第二代继承

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 */ } 

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

回答

5

在Scala编程的this章,由天使的建议,我们下面的例子:

​​

,其导出为以下管道:

Cat -> FourLegged -> HasLegs -> Furry -> Animal 

所以右边的那个有优先权,但是他的祖先,只要他们不是别人的共同祖先就在管道上,也有优先权。这就是为什么HasLegsFurry之前。

最后,这里是为您具体的例子回答:

E -> D -> C -> B -> A