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