如何在scala中重写Trait中的可变变量?

如何在scala中重写Trait中的可变变量?,scala,overriding,Scala,Overriding,我想在构造函数的Trait中重写一个可变变量。但它会抱怨“重写Int类型的trait a中的变量a;变量a不能重写可变变量”。为什么scala不允许我这么做?这方面有什么最佳做法吗?谢谢 trait A{ var a:Int = _ } class B(override var a:Int) extends A 您不能覆盖它(因为现在我没有看到它们自己的原因,除了可以修改变量,所以为什么要覆盖它们),但是您可以不初始化声明的变量,并将后者委托给B: trait A { var a:

我想在构造函数的Trait中重写一个可变变量。但它会抱怨“重写Int类型的trait 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”,您希望实现什么,正如其他人所提到的,您可以通过任何方式进行更改

在许多其他猜测中,有一种猜测是,你会想要像自我类型成员这样的东西吗?其中self-type注释允许您访问mixin trait或类的成员,Scala编译器确保所有依赖项都正确连接?如果是这样的话,像下面这样的方法就行了

trait B{
var a:Int = _
}


尝试使用val而不是var并使用override。 它在抽象类中工作,如下所示:

abstract class A{
  val a:Int = 0
}

class B extends A{
override val a:Int=1
}

你是否简化了你的真实案例来提出这个问题?正如许多答案所指出的,用另一个相同名称和类型的变量覆盖一个变量是毫无用处的。。我在学习我自己。这是关于如何在编译器中自动生成setter和getter以及效率的细节。但我不知道除了故意复制代码之外,为什么还要重写它。
abstract class A{
  val a:Int = 0
}

class B extends A{
override val a:Int=1
}