保留传递给超类构造函数的参数

时间:2011-12-23 16:19:34

标签: scala inheritance

在Scala中,当调用超类构造函数时,不能在当前实例上调用任何方法。因此,没有机会调用一个方法来记忆它在当前实例中返回的值。我如何保留生成的参数以提供给超类构造函数,同时仍然使用继承,而不是组合,并且不修改我继承的类的源代码?

4 个答案:

答案 0 :(得分:2)

您也可以使用

class Foo(arg1: Type1, arg2: Type 2)(
  implicit computed: Hidden[(Type3,Type4)] = (new Type3(arg1), new Type4(arg2))
) extends Bar(computed._1, computed._2) { }

给定的

private[mypackage] class Hidden[A](val value: A) { }
implicit def i_can_hide_things[A](a: A) = new Hidden(a)
implicit def i_can_find_things[A](ha: Hidden[A]) = ha.value

答案 1 :(得分:2)

在Scala 2.8及更高版本中,使用早期定义:

class Foo(arg1: Type1, arg2: Type2) extends {
   val arg3 = new Type3(arg1)
   val arg4 = new Type4(arg2)
} with Bar(arg3, arg4)

即使Bar是一个类而不是一个特征,这也有效。

答案 2 :(得分:1)

使用工厂方法创建伴随对象。 factory方法计算将它们传递给超类构造函数的参数。但它当然没有直接这样做 - 它不能。相反,它会调用您的主要构造函数,您可以将其设置为私有,如下所示:

class C private (private val superclassArg: ArgType) extends Super(superclassArg) { ... }

不幸的是,这个解决方案不是非常具有组合性,因为它不允许你从C继承。使得C public的构造函数会,但它仍然需要重复代码,你可能忘记预处理构造函数参数。我想这取决于你是否认为C的子类以这种方式预处理参数总是必不可少的。

答案 3 :(得分:0)

将另一个类(此处为MemoBar)穿插到继承层次结构中,如下所示:

class Foo(arg1: Type1, arg2: Type2) extends MemoBar(new Type3(arg1), new Type4(arg2)) {
}

class MemoBar(protected val arg3: Type3, arg4: Type4) extends Bar(arg3, arg4) {}

然后,您的arg3arg4将被保留,仅对MemoBar的子类可见(在这种情况下,只有Foo,但您当然可以重用MemoBar 1}}如果您再次遇到与Bar相同的问题。