4

Scalaでは、フィールドをオーバーライドできます。これの利点は何ですか?通常、フィールドを継承し、その値をサブクラスのコンストラクターに設定します。誰かが例を挙げてもらえますか?

4

1 に答える 1

9

前奏曲:

Scala では、s をオーバーライドすることはできません。これvarは、s を共変 (フィールド読み取り) と反変 (フィールド書き込み) でオーバーライドする必要があるためです。つまり、実際には不変でなければなりません。Scala では s を共変にオーバーライドすることができますval。これは、(初期化された後に) 読み取ることしかできないためです。

例:

以下に 2 つの使用例を示します。どちらも特殊化を示しています。次の最小限のクラス階層を想定します。

class A
class B extends A

例 1: 次の例では、フィールドのオーバーライドを使用してサブクラスを特殊化します。つまり、Superインスタンスを操作するときにわかるのはsuper.f、 type のオブジェクトが含まれていることだけですA。ただし、インスタンスを操作する場合、 type の特殊なオブジェクトが含まれてSubいることがわかります。sub.fB

class Super {
  val f: A = new A()
}

class Sub extends Super {
  override val f: B = new B()
}

例 2: フィールド オーバーライドの別のユース ケースは、メソッドをフィールドでオーバーライドすることです。この可能性により、一般的な方法でインターフェースを指定することができます。つまり、潜在的な実装者に、fすべての呼び出しでの値を計算する選択肢を残しますが、 f(インスタンス化中に) 1 回だけ計算することもできます。後者の場合fは定数であり、コンパイラはより積極的な最適化を実行できます。

trait Interface {
  def f: A = new A()
}

class Impl extends Interface {
  override val f: A = new A()
}
于 2012-08-04T12:24:08.263 に答える