2011-04-25 60 views
11
class PasswordCaseClass(val password:String) 
trait PasswordTrait { self:PasswordCaseClass => 
    override def password = "blue" 
} 

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

是否可以用PasswordTrait提供的内容覆盖PasswordCaseClasspassword?现在,我收到此错误:我可以用特征中的方法重写一个scala类方法吗?

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 

回答

19

您可以用val覆盖def,但不能以其他方式进行。 A val意味着保证 - 它的价值是稳定和不可变的 - def没有。

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 = [email protected] 

scala> o.password 
res1: String = blue 
+0

但是,如果我使用字段或方法,Scala应该不会无动于衷吗? – Geo 2011-04-25 08:37:06

+3

那么,关于重写,我认为def可以被val重写,但不是相反。 – 2011-04-25 09:02:58

3

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

无论如何也有编译器的错误 - 错误的解释是完全不清楚的。

+2

错误表示在* value *'password'用* method *'password'重写时出现错误:您必须使用“稳定的,不可变的值”。不明白为什么这是“完全不清楚”。 – gerferra 2011-04-25 09:53:48

+0

我认为好的解释应该是“val和def声明之间的名称冲突”。不要太认真 - 这只是非编译器专家的意见。 – CheatEx 2011-04-25 10:11:52

+0

我认为这个消息比原来的消息更令人困惑。 – 2011-04-25 12:38:50

相关问题