为什么在Scala中扩展时必须重新定义特征中已定义的变量

时间:2012-01-27 13:43:40

标签: scala

为什么我要做

trait Compiler {
  var printInstruction: String
}
class JavaCompiler extends Compiler {
  var printInstruction = "System.out.print(arg0);"
}

而不是

trait Compiler {
  var printInstruction: String
}
class JavaCompiler extends Compiler {
  printInstruction = "System.out.print(arg0);"
}

trait Compiler {
  var printInstruction: String
  def printInstruction: String
}

给出编译错误。

2 个答案:

答案 0 :(得分:8)

因为您没有在特征Compiler中初始化变量。这意味着您希望任何扩展Compile的人都定义行为的变量。

例如,以下内容有效:

class Example extends Compiler {

   var _printInstruction = "foo"

   def pritnInstruction = "I don't care about setter"

   def pritnInstruction_=(pi: String) = _printInstruction = pi
}

如果您希望能够使用

class JavaCompiler extends Compiler {
  printInstruction = "System.out.print(arg0);"
}

然后在Compiler特征中初始化你的var:

trait Compiler {
  var printInstruction: String = _
}

答案 1 :(得分:0)

覆盖变量通常不是您想要做的事情。如果你想要表现的东西,如var,甚至可能是一个,你可以这样做:

trait Compiler {
  def printInstruction: String
  def printInstruction_=(s: String): Unit
}

class JavaCompiler {
  var printInstructions = "System.out.print(arg0);"
}

不知何故,我认为这不是你想要的。那么......你有什么不解释你真正打算完成的事情,所以我们可以更好地建议如何去做?