【问题标题】:Scala inheritance argument listsScala 继承参数列表
【发布时间】:2014-07-03 22:21:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    至少,您可以为每个类使用/定义元组或案例类以使构造函数简单,但这对可选参数没有帮助。或者,如果您熟悉函数式语言,则可能是 curried 构造函数...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多