2012-02-10 2 views
2

は、私は以下のScalaのコードがあるとします。スカラ、superconstructorコールからインスタンスメソッドを呼び出す?

class Foo(a: Int) 

class Bar(b: Buffer[Int]) extends Foo (sum) { 

    def sum = (1 /: b)(_ + _) 

} 

なぜそれがコンストラクタからメソッドを呼び出すsumに文句を言うのでしょうか?このような単純な実装でこのような振る舞いを得ることはできないのでしょうか?私はBarのためにコンパニオンオブジェクトを作ることができることを認識していますが、それは私がやることとまったく同じではありませんか?

PS NO 'superconstructor' タグはありません)))

UPDATE:!の可能な選択肢は何

答えて

3

Barのインスタンスが構築されるたびに、そのすべてのメンバーが追加されています。建設が完了した後でのみ、そのメンバーに電話することができます。

+0

いいですが、どのような代替手段がありますか? – noncom

+1

'class Bar(b:Buffer [Int])はFoo((1 /:b)(_ + _))'を拡張できます。 –

1

sumBarインスタンスで呼び出されていない場合 - それはまだ構築されていないためではありません。 - その場所は間違いなくではなく、の内側にあるBarです。 Barがその唯一のユーザである場合、その自然な場所はコンパニオンオブジェクトです。

もっと興味深いのは、その自然な場所にいない理由です。

+0

次の簡単な例があります: 'duration'と呼ばれる一定期間にわたってオブジェクトに適用されたルールを表す' Rule'クラスがあるとします。そのクラスの子供がたくさんいるかもしれませんが、私は 'RuleChain'や' RuleParallel'のような子どもも欲しいと思っています。これらの2つのクラスには、順番にまたは同時に実行される一連のルールが含まれていても、「ルール」として正確に処理されます。 'Rule'クラスは' duration'をパラメータの1つとしているので、チェーンの持続時間の合計と並列の最長時間を渡す必要があります。したがって、いくつかのメソッドを呼び出す必要があります。 – noncom

+1

@noncom私が理解していないのは、そのメソッドがインスタンスではないので、メソッドがオブジェクトではなくクラスになければならないと感じる理由です。 –

+0

はい、あなたは正しいです、私はちょうどJavaでそれほど大きな違いはなかったと思いました。ここでScalaはアプリケーション設計のより厳密な懸念を強要し、今ではより正確なものとして認識しています。これを念頭において、コンパニオンオブジェクトがそのようなメソッドのための最良の場所であることは明らかです。 – noncom

関連する問題