在Scala中,我如何使用多个构造函数继承Java类?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

假设我有一个带有多个构造函数的Java类:

class Base {
    Base(int arg1) {...};
    Base(String arg2) {...};
    Base(double arg3) {...};
}

我怎样才能在Scala中扩展它,并且仍然可以访问Base的三个构造函数?在Scala中,子类只能调用其超类的构造函数之一。我该如何解决这个规则?

假设Java类是我无法更改的遗留代码。

提问于
用户回答回答于

很容易忘记一个特质可能会延长课程。如果你使用特质,你可以推迟决定调用哪个构造函数,如下所示:

trait Extended extends Base {
  ...
}

object Extended {
  def apply(arg1: Int) = new Base(arg1) with Extended
  def apply(arg2: String) = new Base(arg2) with Extended
  def apply(arg3: Double) = new Base(arg3) with Extended
}

特征本身可能不具有构造函数参数,但您可以通过使用抽象成员来解决该问题。

用户回答回答于

这是来自斯卡拉邮件列表上的一个问题,涉及提供三种不同的构造函数(即复制Java设计),而不是扩展类

假设每个构造函数最终创建对象的状态 S,请使用“静态”方法创建伴随对象以创建此状态

object Base {
  private def stateFrom(d : Double) : S = error("TODO")
  private def stateFrom(s : Str) : S = error("TODO")
  private def stateFrom(i : Int) : S = error("TODO")
} 

然后创建一个私有的构造函数,将状态和(公共)重载构造函数按照主构造函数进行构造

import Base._
class Base private(s : S) { //private constructor takes the state
  def this(d : Double) = this(stateFrom(d)) 
  def this(str : String) = this(stateFrom(str))
  def this(i : Int) = this(stateFrom(i))
  //etc
}

扫码关注云+社区