0

假设我们有

scala> trait A { val y: Int; val x = 1; val y2 = y + 1 }

scala> trait B { val y: Int = 1; val x: Int; val x2 = x + 1 }

scala> class C extends A with B

然后两者都 y2应该x2以 2 in 的值结束C。现在,如果我们混入AthenBy2值为 1,因为 的值为y默认值 0。同样,如果我们混入then 则x2值为 1 。此外,如果这些东西是 Objects 而不是 Ints,那么我们最终可能会得到一个.BANullPointerException

在理想的世界中,我想要的是初始化不是懒惰的,而是初始化的顺序由值的依赖图自动暗示。即一种告诉编译器重新调整初始化顺序而不是使用默认值的方法。此外,我不想将特征重构为更小的特征,然后自己制定正确的混合顺序(在一个巨大的项目中,有时我必须混合 5 个特征,这很难解决)。

更新:换句话说……当我们混合特征时,我们想象将特征叠加在彼此之上,但是当涉及到 vals 时,它并没有真正像这样工作……如何让它像这样工作

更新:如果真的不可能,我会很高兴有人可以共享一个链接,指向任何已经存在的类型安全功能请求票,方法是向 scala 添加一个名为“overlay”的关键字,该关键字可以沿线使用的:

scala> class C overlay A overlay B
4

1 回答 1

1

你不能。特征按照给定的顺序进行初始化,这就是它必须是的 - 其他任何事情都无法推理,初始化顺序是可预测的比它是最优的更重要。您唯一的选择是使用惰性(或使用 def 而不是 val),或者为此不使用特征。

于 2014-11-06T11:53:44.133 回答