Использование альтернативного конструктора суперкласса в создании экземпляров дочерних классов - PullRequest
0 голосов
/ 03 января 2019

У меня есть базовый класс с двумя конструкторами и дочерний класс, который имеет один конструктор. Можно ли создать экземпляр дочернего класса, используя конструктор второго базового класса?

Пример кода:

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)

Будет ли это единственным / обычным способом решения этой проблемы, или есть что-то более умное, которое включает в себя меньше кода и прошлого кода? (так как у меня есть тонна дочерних классов того же образца)

[править] Для пояснения, второй конструктор будет одинаковым в каждом дочернем классе, поэтому я бы хотел, чтобы он реализовывался только один раз в базовом классе. Тем не менее, необходимость помещать другой конструктор в каждый дочерний класс как-то побеждает эту цель, и поэтому у меня не будет двух конструкторов в базовом классе, а только во всех дочерних классах.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вы должны добавить определение конструктора в каждый дочерний класс, как вы описали.

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

Представьте, что дочерний класс определяет новые поля, которые недоступны в базовом классе.Создание дочернего класса с помощью базового конструктора не определит такие поля и не приведет к частичной инициализации экземпляра класса.

Если ваш базовый конструктор имеет ценную логику, имеет смысл сохранить его в базовом классе.И просто «свяжите» его с базовым конструктором в дочернем классе.

0 голосов
/ 03 января 2019

Можно ли создать экземпляр дочернего класса с помощью [второго] конструктора базового класса?

номер

Вы никогда не можете использовать конструктор суперкласса для создания экземпляра подкласса. Вы должны вызвать конструктор для создаваемого вами класса. Конструктор подкласса должен вызывать конструктор для суперкласса, но вы не можете вызвать его напрямую.

Итак, причина, по которой вы можете сделать это

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

означает, что RuleConditionAbove имеет конструктор с этими аргументами. Это не имеет ничего общего с тем, что RuleCondition имеет конструктор с такими же аргументами.

И причина, по которой вы не можете сделать это

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

означает, что RuleConditionAbove не имеет конструктора с этими аргументами.

...