Set*_*sue 57 java constructor scala multiple-constructors
假设我有一个带有多个构造函数的Java类:
class Base {
Base(int arg1) {...};
Base(String arg2) {...};
Base(double arg3) {...};
}
Run Code Online (Sandbox Code Playgroud)
如何在Scala中扩展它并仍然提供对Base的所有三个构造函数的访问?在Scala中,子类只能调用其中一个超类的构造函数.我该如何解决这条规则?
假设Java类是我无法更改的遗留代码.
Set*_*sue 89
很容易忘记一个特质可能扩展一个类.如果使用特征,则可以推迟决定调用哪个构造函数,如下所示:
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
}
Run Code Online (Sandbox Code Playgroud)
特征本身可能没有构造函数参数,但您可以通过使用抽象成员来解决这个问题.
编辑 - 这是来自scala邮件列表上的一个问题,我认为这里是重复的.我的答案涉及提供三种不同的构造函数(即复制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")
}
Run Code Online (Sandbox Code Playgroud)
然后创建一个私有构造函数,使用状态和(公共)重载构造函数,这些构造函数遵循主构造函数
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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9562 次 |
| 最近记录: |