我有一个带有两个构造函数的基类,以及一个具有一个构造函数的子类。是否可以使用第二个基类构造函数实例化子类?
示例代码:
abstract class RuleCondition(rule:Rule, field:String, equal:Boolean, inverted:Boolean)
{
// alternate constructor with RuleValue instead of static comparation value
def this(rule:Rule, field:String, ref:RuleValue, equal:Boolean = false, inverted:Boolean = false) = ???
}
class RuleConditionAbove(rule:Rule, field:String, comparationValue:Long, equal:Boolean = false, inverted:Boolean = false)
extends RuleCondition(rule, field, equal, inverted)
{
// ...
}
现在,我可以这样做:
val myAboveCondition = new RuleConditionAbove(rule, "bla", 10, true, false)
但我不能这样做:
val myAboveCondition = new RuleConditionAbove(rule, "bla", RuleValue(...), true, false)
因为RuleCondition
基类的替代构造函数不可见。一旦将其添加到子类中,它将可见:
def this(rule:Rule, field:String, ref:RuleValue, equal:Boolean = false, inverted:Boolean = false) = this(rule, field, ref, equal, inverted)
这将是解决此问题的唯一/常用方法,还是有一些更聪明的方法来减少复制和过去的代码?(因为我有很多相同样式的子类)
[编辑]为了澄清,第二个构造函数将在每个子类相同的,因此,我想有它在基类中实现一次。但是,仍然必须在每个子类中放置另一个构造函数将以某种方式无法实现此目的,因此,我在基类中不会只有两个构造函数,而在所有子类中都没有。
是否可以使用[second]基类构造函数实例化子类?
没有。
您永远不能使用超类构造函数来创建子类的实例。您必须为要创建的类调用构造函数。子类构造函数必须为超类调用构造函数,但不能直接调用它。
所以你可以这样做的原因
val myAboveCondition = new RuleConditionAbove(rule, "bla", 10, true, false)
是RuleConditionAbove
具有这些参数的构造函数。它与RuleCondition
具有相同参数的构造函数无关。
以及您无法执行此操作的原因
val myAboveCondition = new RuleConditionAbove(rule, "bla", RuleValue(...), true, false)
是RuleConditionAbove
没有带有这些参数的构造函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句