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

我们可以通过有两个构造函数来做到这一点——一个接受参数和生成的参数,另一个只接受用户应该提供的参数。

我们将第一个构造函数设为私有,以免人们意外使用它,然后我们使用第二个构造函数构造值并将其传递给第一个构造函数。

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 回答