0

コンストラクターで名前別パラメーターを取るクラスを拡張したい場合があります。

class Extension(something: Something) 
  extends Base(something.doSomething(something.getSomething(false))

class Base(expression: => Result) {
  ...
}

ただし、 の呼び出しはsomething.getSomething(false)副作用を引き起こすため、複数回呼び出すことはできません。

something.getSomething(false)スーパークラスのコンストラクターに渡す前に、の結果を保存するにはどうすればよいですか?

4

1 に答える 1

0

これを行うには、パラメーターと生成されたパラメーターの両方を受け取るコンストラクターと、ユーザーが提供する必要があるパラメーターのみを受け取るコンストラクターの 2 つを用意します。

最初のコンストラクターを非公開にして、人々が誤って使用しないようにし、2 番目のコンストラクターを使用して値を構築し、それを最初のコンストラクターに渡します。

class Extension private (something: Something, generatedFromSomething: Generated)
    extends Base(something.doSomething(generatedFromSomething) {
  def this(something: Something) = this(something, something.getSomething(false))
}

ErikAllikがコメントで示唆しているように、可能であれば継承を避けるのが最善かもしれません。

def extended(something: Something) = {
  val generatedFromSomething = something.getSomething(false)
  new Base(something.doSomething(generatedFromSomething)
}
于 2014-11-05T12:57:27.557 に答える