【问题标题】:Using alternative super class constructor in child class instantiation在子类实例化中使用替代超类构造函数
【发布时间】:2019-05-29 19:41:25
【问题描述】:

我有一个有两个构造函数的基类和一个有一个构造函数的子类。是否可以使用第二个基类构造函数来实例化子类?

示例代码:

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)

这是解决此问题的唯一/常用方法,还是有更智能的方法可以减少复制和过去的代码? (因为我有很多相同模式的子类)

[edit] 澄清一下,第二个构造函数 在每个子类中都是相同的,因此我希望它只在基类中实现一次。 然而,仍然必须在每个子类中放置另一个构造函数会以某种方式破坏这个目的,因此我不会在基类中有两个构造函数,而只会在所有子类中。

【问题讨论】:

    标签: scala inheritance constructor polymorphism superclass


    【解决方案1】:

    是否可以使用 [second] 基类构造函数来实例化子类?

    没有。

    您永远不能使用超类构造函数来创建子类的实例。您必须为正在创建的类调用构造函数。子类的构造函数必须调用超类的构造函数,但不能直接调用。

    所以你可以这样做的原因

    val myAboveCondition = new RuleConditionAbove(rule, "bla", 10, true, false)
    

    RuleConditionAbove 有一个带有这些参数的构造函数。这与RuleCondition 具有具有相同参数的构造函数这一事实无关。

    以及你不能这样做的原因

    val myAboveCondition = new RuleConditionAbove(rule, "bla", RuleValue(...), true, false)
    

    RuleConditionAbove 没有带有这些参数的构造函数。

    【讨论】:

      【解决方案2】:

      您必须按照您的描述在每个子类中添加构造函数定义。

      def this(rule:Rule, field:String, ref:RuleValue, equal:Boolean = false, inverted:Boolean = false) = this(rule, field, ref, equal, inverted)
      

      想象一个子类定义了基类中不可用的新字段。使用基本构造函数创建子类不会定义此类字段,并且会部分初始化该类的实例。

      如果您的基构造函数具有有价值的逻辑,则将其保留在基类中是有意义的。只需将其“链接”到子类中的基本构造函数即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-27
        • 2012-12-10
        相关资源
        最近更新 更多