Как переопределить изменяемую переменную в 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