我想在构造函数中覆盖Trait中的一个可变变量。但它会抱怨“在Int类型的特征A中覆盖变量a;变量a不能覆盖可变变量”。为什么scala不允许我这样做?对此最好的做法是什么?感谢
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
答案 0 :(得分:13)
你不能覆盖它(因为现在没有向我揭示的原因,除了可以修改vars以便为什么要覆盖它们),但你可以保留声明的变量uninitialised并将后者委托给{{ 1}}:
B
答案 1 :(得分:7)
覆盖仅适用于方法。覆盖变量没有意义。如果用另一个相同类型的变量覆盖变量会有什么变化?如果有的话,价值和那个只能随时设置,因为它是一个变量:
trait A {
var a: Int = _
}
class B (a0: Int) extends A {
a = a0
}
但这可能不是你想要的。你也可以留下getter和setter摘要:
trait A {
def a: Int
def a_=(value: Int): Unit
}
class B(var a: Int)
然后相当于
trait A {
var a: Int
}
答案 2 :(得分:1)
请注意确切地想要实现“覆盖”“var”的目的,正如其他人提到的那样,你可以改变它。
在许多其他猜测中,有一个是你想要类似自我类型的成员吗? self类型注释允许您访问mixin特性或类的成员,Scala编译器确保所有依赖项都正确连接?如果是这样,以下内容将起作用。
trait B{
var a:Int = _
}
trait A{self:B=> var b= a}
class C extends A with B
答案 3 :(得分:1)
尝试使用val而不是var并使用override。 当A是抽象类时它起作用,像这样:
abstract class A{
val a:Int = 0
}
class B extends A{
override val a:Int=1
}