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.f
B
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()
}