Могу ли я переопределить метод класса scala методом с признаком?

class PasswordCaseClass(val password:String)
trait PasswordTrait { self:PasswordCaseClass =>
    override def password = "blue"
}

val o = new PasswordCaseClass("flowers") with PasswordTrait

Можно ли переопределить PasswordCaseClass password то, что предусмотрено в PasswordTrait? Прямо сейчас, я получаю эту ошибку:

e.scala:6: error: overriding value password in class PasswordCase
Class of type String;
 method password in trait PasswordTrait of type => java.lang.String needs to be a stable,
immutable value
val o = new PasswordCaseClass("flowers") with PasswordTrait
            ^
one error found

Я хотел бы иметь что-то вроде этого:

class User(val password:String) {
}

trait EncryptedPassword { u:User =>
  def password = SomeCriptographyLibrary.encrypt(u.password)
}

val u = new User("random_password") with EncryptedPassword
println(u.password) // see the encrypted version here

Ответ 1

Вы можете переопределить def с помощью val, но вы не можете сделать это наоборот. A val подразумевает гарантию - что это значение является стабильным и неизменным - что a def не имеет.

Ответ 2

Это сработало для меня (с некоторыми изменениями):

trait PasswordLike {
 val password: String 
}

class PasswordCaseClass(val password:String) extends PasswordLike

trait PasswordTrait extends PasswordLike {
 override val password: String = "blue"
}

а затем:

scala> val o = new PasswordCaseClass("flowers") with PasswordTrait
o: PasswordCaseClass with PasswordTrait = [email protected]

scala> o.password
res1: String = blue

Ответ 3

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

Во всяком случае, есть ошибка компилятора - объяснение ошибки полностью неясно.