我想在构造函数中覆盖 Trait 中的一个可变变量。但它会抱怨“在 Int 类型的特征 A 中覆盖变量 a;变量 a 不能覆盖可变变量”。为什么scala不允许我这样做?对此有什么最佳实践吗?谢谢
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
我想在构造函数中覆盖 Trait 中的一个可变变量。但它会抱怨“在 Int 类型的特征 A 中覆盖变量 a;变量 a 不能覆盖可变变量”。为什么scala不允许我这样做?对此有什么最佳实践吗?谢谢
trait A{
var a:Int = _
}
class B(override var a:Int) extends A
您不能覆盖它(由于现在不向我透露的原因,除了无论如何都可以修改变量,所以为什么要覆盖它们),但是您可以保留声明的变量未初始化并将后者委托给B
:
trait A {
var a: Int
}
class B(var a: Int) extends A
覆盖仅适用于方法。覆盖变量没有意义。如果用另一个相同类型的变量覆盖一个变量,会发生什么变化?如果有的话,无论如何都可以随时设置该值,因为它是一个变量:
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
}
请注意确切地确定您希望通过尝试“覆盖”“var”来实现什么,正如其他人提到的那样,您无论如何都可以更改。
在许多其他猜测中,一个是您想要类似自我类型成员的东西?自类型注释允许您访问 mixin 特征或类的成员,而 Scala 编译器确保所有依赖项都正确连接?如果是这样,类似下面的东西会起作用。
trait B{
var a:Int = _
}
trait A{self:B=> var b= a}
class C extends A with B
尝试使用 val 而不是 var 并使用覆盖。它在 A 是抽象类时起作用,如下所示:
abstract class A{
val a:Int = 0
}
class B extends A{
override val a:Int=1
}