如果我在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特征相关部分必须被视为单一事物,而不是每个遗传情况都重复?无论如何,在那种情况下,编译器的想法是什么样的?
答案 0 :(得分:5)
我相信,Programming in Scala的这一章可以帮助你理解特质线性化过程:
答案 1 :(得分:5)
根据tenshi的建议,在Scala编程的this章节中,我们有以下示例:
class Animal
trait Furry extends Animal
trait HasLegs extends Animal
trait FourLegged extends HasLegs
class Cat extends Animal with Furry with FourLegged
其中包含以下管道:
Cat -> FourLegged -> HasLegs -> Furry -> Animal
所以右边的那个有优先权,但他的祖先,只要他们不是管道上其他人的共同祖先,也有优先权。这就是HasLegs
出现在Furry
之前的原因。
最后,这是您特定示例的答案:
E -> D -> C -> B -> A