我可以使用特征中的方法覆盖scala类方法吗?

Geo*_*Geo 13 scala

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

val o = new PasswordCaseClass("flowers") with PasswordTrait
Run Code Online (Sandbox Code Playgroud)

是否有可能重写PasswordCaseClasspassword与什么是在提供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
Run Code Online (Sandbox Code Playgroud)

我希望能够有这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 24

您可以def使用a 覆盖a val,但不能以相反的方式执行.A val意味着一种保证 - 它的价值是稳定的和不可变的 - 而a def则不然.


Ant*_*jdr 8

这对我有用(经过一些修改):

trait PasswordLike {
 val password: String 
}

class PasswordCaseClass(val password:String) extends PasswordLike

trait PasswordTrait extends PasswordLike {
 override val password: String = "blue"
}
Run Code Online (Sandbox Code Playgroud)

然后:

scala> val o = new PasswordCaseClass("flowers") with PasswordTrait
o: PasswordCaseClass with PasswordTrait = $anon$1@c2ccac

scala> o.password
res1: String = blue
Run Code Online (Sandbox Code Playgroud)

  • 好吧,关于覆盖,我认为def可以被val覆盖,但不能反过来. (3认同)