14

我想在构造函数中覆盖 Trait 中的一个可变变量。但它会抱怨“在 Int 类型的特征 A 中覆盖变量 a;变量 a 不能覆盖可变变量”。为什么scala不允许我这样做?对此有什么最佳实践吗?谢谢

trait A{
  var a:Int = _
}

class B(override var a:Int) extends A
4

4 回答 4

16

您不能覆盖它(由于现在不向我透露的原因,除了无论如何都可以修改变量,所以为什么要覆盖它们),但是您可以保留声明的变量未初始化并将后者委托给B

trait A {
  var a: Int
}

class B(var a: Int) extends A
于 2013-05-07T08:04:08.053 回答
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
}
于 2013-05-07T08:05:44.460 回答
1

请注意确切地确定您希望通过尝试“覆盖”“var”来实现什么,正如其他人提到的那样,您无论如何都可以更改。

在许多其他猜测中,一个是您想要类似自我类型成员的东西?自类型注释允许您访问 mixin 特征或类的成员,而 Scala 编译器确保所有依赖项都正确连接?如果是这样,类似下面的东西会起作用。

trait B{
var a:Int = _

}

trait A{self:B=> var b= a}
class C extends A with B
于 2013-05-07T11:21:45.997 回答
1

尝试使用 val 而不是 var 并使用覆盖。它在 A 是抽象类时起作用,如下所示:

abstract class A{
  val a:Int = 0
}

class B extends A{
override val a:Int=1
}
于 2018-04-15T09:58:58.940 回答