Kotlin: Как дочерний конструктор может использовать вторичный конструктор своего родителя?

Например, у нас есть этот родитель:

open class Parent(val id: Int, val name: String?) { constructor() : this(-1, null) } 

И ребенок, который должен иметь как конструктор с двумя параметрами, так и пустой конструктор, например родительский:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : super() // syntax error } 

Как дочерний конструктор может использовать вторичный конструктор своего родителя?

Я знаю, что я могу реализовать дочерний конструктор, передающий те же значения, что и родительский, но это не только кажется избыточным, но и часто, когда мои дочерние элементы имеют дополнительные параметры для его основного конструктора, но не требуют промежуточных конструкторов (конструкторы с параметрами которые не включают все дополнительные параметры). Вот пример ребенка, реализующий его таким образом, на случай, если я не понял:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null) // no syntax error, but redundant } 

Лучший способ достичь этого – imho, используя параметры по умолчанию для вашего конструктора

 class Child(id: Int = -1, name: String? = null) : Parent(id, name) 

В зависимости от того, какое влияние вы оказываете на Parent класс, возможно, даже

 class Parent(val id: Int = -1, val name: String? = null) 

У этого есть один «недостаток», хотя: вы получите технически три разных конструктора. Но я не вижу, как это может быть проблемой, поскольку в любом случае вы должны обрабатывать id=-1 и name=null .

Кроме того, я не думаю, что ваше решение

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null) } 

является плохим или «избыточным» в любом случае – наоборот: он очень выразительный и явный, поэтому читатель точно знает, что вы сделали.

Во-первых, вы не можете Parent класс Parent поскольку он не open .

Во-вторых, если класс объявил первичный конструктор, вы не можете вызвать конструктор суперкласса через super ключевое слово.

С другой стороны, если вы хотите вызвать конструктор суперкассы по ключевому слову super . вам нужно сделать первичный конструктор вторичным конструктором, например:

 class Child : Parent { constructor(id: Int, name: String?) : super(id, name) constructor() : super() } 

Другой вариант – позволить второму конструктору вызвать основной конструктор по this ключевому слову, но я думаю, что это необязательно и дублирует параметры со вторичным конструктором суперкласса:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null); }