Scalaでは、フィールドをオーバーライドできます。これの利点は何ですか?通常、フィールドを継承し、その値をサブクラスのコンストラクターに設定します。誰かが例を挙げてもらえますか?
1 に答える
前奏曲:
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()
}