9

クラスEnumeration#ValのScaladocで、次のように読むことができます。「Value型を実装するクラス。このクラスをオーバーライドして、列挙の名前付けと整数識別の動作を変更できます。」私は困惑しています:クラスをオーバーライドするにはどうすればよいですか?のようなoverride class Val extends super.Valものは許可されていません。

4

1 に答える 1

12

Scala には (まだ) 仮想クラスがないためoverride class Val ...new Val. 代わりに、外側のクラスのインスタンス (この場合は ) への参照の型に基づいてクラスが選択されますEnumeration

仮想クラスをエミュレートするための一般的な方法はclass Val extends super.Val、 を記述してから、クラスのインスタンスのファクトリとして機能する保護されたメソッドをオーバーライドすることです。この場合、メソッドもオーバーライドする必要があります。

protected def Value(i: Int, name: String): Value = new Val(i, name)

EnumerationValこのファクトリ メソッドのみを使用してインスタンスを作成します。一般に、このパターンはプログラマ側の規律を必要としますが、コンストラクターをプライベートに宣言し、プログラマーにファクトリー メソッドの使用を強制することで保証できます。

于 2010-12-02T17:11:51.047 に答える