1

私はscalaに不慣れで、練習をしているだけです。私は非常に単純なプログラムを試しました。次のように簡単に説明しました。

abstract class Device(val cds: Array[Char]) {
  var codes = Array[Char](cds: _*)
  def encrpt(code: Char): Char

  var nextDevice: Device

  def setNext(next: Device):Unit = {
    nextDevice = next
  }
}

//compiler error shows here
class Input(codes: Array[Char]) extends Device(codes) {
  override def encrpt(code: Char) = code
}

21行目にコンパイラエラーがあることがわかります。次のメッセージが表示 されます。com.me.acm.problem1009.DeviceタイプのクラスDeviceの変数nextDeviceが定義されていないため、クラス入力は抽象である必要があります(変数は定義するために初期化されます)

私の理解では、そのエラーをかなり混乱させています。親クラスでいくつかの変数とセッターメソッドを定義しているので、子クラスはそれを再度定義しなくても使用できます。それは簡単です。

私は何かを逃したと思います。誰かが私にそれを説明し、正しい方法を教えてもらえますか?ありがとう。

4

2 に答える 2

4

Scalaでは、変数はJava(または他の多くの言語)の場合のようにデフォルト値を想定していません。したがって、変数を宣言するときは、常にその初期値を指定する必要があります。

コードでは、変数を宣言しますnextDeviceが、値を指定しません。Scalaは常に値を必要とするため、作成した内容をnextDevice抽象フィールドとして解釈します。そのため、コンパイラーは、値をオーバーライドする必要があることを通知します。

たとえば、初期値を指定するためにその行を次のように変更すると、エラーは消えます。

var nextDevice: Device = new Input(Array())
于 2013-01-07T06:36:06.847 に答える
3

エラーメッセージが表示しているように、変数nextDeviceはのコンストラクタで初期化する必要がありますInput

class Input(codes: Array[Char]) extends Device(codes) {
  override def encrpt(code: Char) = code
  nextDevice = null
}

nullScalaでは使用が嫌われていることに注意してください。おそらく変数のタイプを次のように変更する必要がありますOption[Device]

于 2013-01-07T06:35:34.747 に答える