Scala继承参数列表

时间:2014-07-03 22:21:02

标签: scala inheritance parameter-passing multiple-inheritance optional-parameters

如果我在Scala中有一个基类,例如:

class Base(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int = 1, g: Int = 2) {}

我希望多个类从这个基类继承,但我想在该列表中添加参数。有没有一种有效的方法可以做到这一点,而无需携带基类的大量参数列表?

为了使事情更复杂,基类可能会也可能不会重新定义可选参数(f和g)。可以想像:

class Child1(f: Int, h: Int, i: Int) extends Base(a,b,c,d,e,f)

它当然会像

new Child1(a=1, b=2, c=3, d=4, e=5, f=6, g=7, h=8, i=9)

在Scala中有一个很好的方法吗? (我考虑过通过定义参数的每个构造函数传递一个映射,但是没有编译时检查是否存在必需的参数,它依赖于开发人员检查文档以查看它们应包含的内容。如果密钥拼写错误怎么办?等...)

1 个答案:

答案 0 :(得分:2)

如果构造函数的参数数量很大,则为 因为你不想在定义中再次重复这些论点, 那么你应该考虑构造函数的其他模式。

你可以阅读这个问题及其答案 How many constructor arguments is too many?
无论是Java还是Scala,面向对象编程的本质都不会改变。

您还可以使用构建器模式(使用大量setter方法并调用build()方法),type-safe builder pattern进行一些权衡,或等等。

此外,对元组arity,case类构造函数参数,函数参数的数量有(并且可能是)限制。
22 fields limit in case classes
Why are scala functions limited to 22 parameters?
我不知道它是否仍然存在,但Scala的开发人员正试图将其删除 [SI-7296] Remove arity limit for case classes - Scala
然而,制作一个有这么多论点的函数是一个坏习惯。

至少,你可以为每个类使用/ define元组或case类来使构造函数变得简单,但它对可选参数没有帮助。如果你熟悉函数式语言,或者也许是curried构造函数......