0

如果我有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) 

是否有斯卡拉做到这一点的好办法? (我想过通过定义参数的每个构造函数传递映射,但是没有编译时检查是否存在必需的参数,并且它依赖于开发人员检查文档以查看它们应包含的内容。如果键被拼写错误怎么办?等等...)

回答

2

如果构造函数的参数的数目是大的,
因为你不希望在定义再赘述了,
那么你应该考虑为其他模式构造函数。

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

您还可以使用构建器模式(使用许多setter方法并调用build()方法),type-safe builder pattern以及某些量的权衡,等等。

另外,(有可能是)元组数据的数量,case类构造函数参数,函数参数的限制。
22 fields limit in case classes
Why are scala functions limited to 22 parameters?
我不知道它是否仍然存在,但斯卡拉的开发商正试图将其删除。
[SI-7296] Remove arity limit for case classes - Scala
不过,制作一个有很多参数的函数是一个坏习惯。

至少,您可以为每个类使用/定义元组或大小写类来简化构造函数,但对可选参数没有帮助。或者,如果你熟悉功能语言,也许是咖啡馆的构造者...