假设我有一个具有多个构造函数的Java类:
class Base {
Base(int arg1) {...};
Base(String arg2) {...};
Base(double arg3) {...};
}
我如何在Scala中扩展它,同时仍然提供对Base的所有三个构造函数的访问?在Scala中,一个子类只能调用它的一个超类的构造函数。我该如何绕过这个规则呢?
假设Java类是我不能更改的遗留代码。
发布于 2010-07-21 21:40:02
很容易忘记一个特征可以扩展一个类。如果你使用一个特征,你可以推迟决定调用哪个构造函数,如下所示:
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
}
特征本身可能没有构造函数参数,但是你可以通过使用抽象成员来解决这个问题。
发布于 2010-07-21 21:36:35
我会选择最通用的一个(在本例中是String),如果它满足其他条件,则自己进行内部转换。
虽然我承认这不是最好的解决方案,但我觉得有些地方是错的。:-(
发布于 2010-07-21 21:59:15
这是一个愚蠢的答案,可能会有点用,但如果Java类有太多的构造函数,可能会太费力,但是:
用Java编写一个子类,实现一个构造函数,该构造函数接受其他各种构造函数的所有输入,并根据输入的存在与否调用其超类的正确构造函数(通过使用"null“或某种类型的标记值),然后在Scala中子类化该Java类,并将标记值指定为默认参数。
https://stackoverflow.com/questions/3299776
复制相似问题