Как переопределить изменяемую переменную в Trait в scala?

Я хотел бы переопределить одну изменяемую переменную в Trait в конструкторе. Но он будет жаловаться, что "переопределяющая переменная a в признаке A типа Int, переменная a не может переопределить изменяемую переменную". Почему scala не позволяет мне это делать? И любая лучшая практика для этого? Благодаря

trait A{
  var a:Int = _
}

class B(override var a:Int) extends A

Ответы

Ответ 1

Вы не можете переопределить его (по причинам, которые сейчас не раскрываются мне, кроме того, что вары могут быть изменены в любом случае, поэтому зачем их переопределять), но вы можете оставить объявленную переменную неинициализированной и делегировать ее последнему на B:

trait A {
  var a: Int
}

class B(var a: Int) extends A

Ответ 2

Переопределение только для методов. Не имеет смысла переопределять переменную. Что изменится, если вы переопределите переменную с другой переменной того же типа? Во всяком случае, значение и его можно просто установить в любое время, потому что это переменная:

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
}

Ответ 3

Обратите внимание на то, что вы хотели бы добиться, пытаясь "переопределить" "var", который, как уже упоминалось, вы можете изменить в любом случае.

Среди многих других догадок, один из них заключается в том, что вы хотели бы что-то вроде членов типа self? где аннотация типа self позволяет вам получить доступ к элементам признака mixin или класса, а компилятор Scala гарантирует, что все зависимости правильно подключены? Если да, то что-то вроде следующего будет работать.

trait B{
var a:Int = _

}

trait A{self:B=> var b= a}
class C extends A with B