2010-12-02 14 views
9

Enumeration#ValクラスのScaladocでは、「Value型を実装しているクラスです。このクラスは、列挙の名前付けと整数の識別動作を変更するためにオーバーライドできます。私は困惑しています:どのようにクラスを無効にするのですか? override class Val extends super.Valのようなものは許可されていません。Scalaの内部クラスを "オーバーライド"する方法はありますか?

+0

内部クラスを定義することは可能です。 'Class Val(i:Int、name:String)はsuper.Val(i、name)'を継承しますが、インスタンス化されないのでEnumeration#Valをオーバーライドすることはほとんどありませんすべて。 –

答えて

12

スカラにはまだ仮想クラスがありませんので、override class Val ...と書くことはできません。new Valを呼び出すと、新しいインスタンスに適切なクラスが動的に選択されるようにしてください。その代わりに、クラスを囲むクラスのインスタンスへの参照のタイプに基づいてクラスを選択することができます(この場合はEnumeration)。

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

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

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

+0

説明をありがとう。今私はさらに最終的な方法をオーバーライドする方法についてもっと興味があります... –

+0

うーん...あなたは正しいです。私はこれをチェックさせてください。 – axel22

+0

(他の読者の説明と同じように、実際にはEnumeration.scalaでは最終的にメソッドが記述されています。)ところで、「Scalaにはまだ仮想クラスはありません」と書いてあります。これは将来起こる可能性がありますか? –

関連する問題