Почему я должен переопределить уже определенную переменную в признаке при расширении в Scala - PullRequest
1 голос
/ 27 января 2012

Почему я должен делать

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 ]

8 голосов
/ 27 января 2012

Поскольку вы не инициализируете переменную с чертой 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:

trait Compiler {
  var printInstruction: String = _
}
0 голосов
/ 27 января 2012

Переопределение переменных обычно не то, что вы хотите сделать. Если вы хотите что-то, что ведет себя как var, и может даже быть одним, вы делаете это:

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

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

Почему-то я не думаю, что это то, что ты намеревался. Итак ... что вы не объясните, чего вы на самом деле намереваетесь достичь, чтобы мы могли лучше посоветовать, как это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...