如何覆盖方法中的val?

时间:2014-09-01 09:25:33

标签: scala

我的scala特征是这样的:

trait A {
 def foo()

 val val1:Set[Set1]
}

我有一个扩展这个特性的类。像这样:

class B extends A {

 override val val1 = //Something
 override def foo() {
   //change Something here 
 } 
}

有可能这样做吗?

2 个答案:

答案 0 :(得分:4)

继承与"更改"无关。瓦尔斯。首先,你无法重新启动val:

class B {
  val val1 = Set("Something")

  def foo(): Unit = {
    val1 = Set("Some other thing")  // reassigning val1; will not compile
  }
}

val表示不可变变量,因此您无法更改这些变量包含的内容。

但是,如果它们的类型支持,您可以更改这些变量。例如,如果我们使val1成为可变集,然后尝试在方法中修改此集:

import scala.collection.mutable

class B {
  val val1 = mutable.Set("Something")

  def foo(): Unit = {
    val1 += "Another thing"
  }
}

然后它会正常工作。

答案 1 :(得分:0)

除非您要更改方法val1中的值foo,否则就是如何覆盖val和defs。

您可以使用defs覆盖valsvals,但无法使用vals覆盖defs

trait A {
  val a:Int
}

class B extends A {
  def a = 5           //Compilation error
}