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

时间:2011-04-25 08:02:54

标签: scala

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

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

是否可以使用PasswordCaseClass中提供的内容覆盖password的{​​{1}}?现在,我收到了这个错误:

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

3 个答案:

答案 0 :(得分:24)

您可以使用def覆盖val,但不能以相反的方式执行此操作。 val意味着保证 - 它的值是稳定且不可变的 - def没有。

答案 1 :(得分:8)

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

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 = $anon$1@c2ccac

scala> o.password
res1: String = blue

答案 2 :(得分:4)

您正尝试使用方法定义覆盖该值。它根本没有意义 - 它们有不同的语义。应该每个对象生命周期计算一次的值(并存储在最终的类属性中)和方法可以多次计算。所以你要做的就是以多种方式制定班级合同。

无论如何还有编译器的错误 - 错误说明完全不清楚。