Недавно началось с Котлина
Согласно документам Котлина, может быть один первичный конструктор и один или несколько вторичных конструкторов.
Я не понимаю, почему я вижу эту ошибку
Поскольку test
класса не имеет первичного конструктора.
Это прекрасно работает:
open class test { } class test2 : test() { }
И вот еще одна трудность, с которой я столкнулся, когда я определяю вторичный конструктор, IDE показывает еще одну ошибку:
Инициализация супертипа невозможна без основного конструктора
![]()
Но в предыдущем рабочем примере я инициализировал его, но он работал нормально. Что я ошибся?
Вы получаете эту ошибку, потому что, даже если вы не определяете первичный или вторичный конструктор в базовом классе, по-прежнему существует конструктор no-argument по умолчанию, сгенерированный для этого класса. Конструктор производного класса должен всегда вызывать некоторые из суперконструкторов, и в вашем случае есть только по умолчанию (это конструктор, который вы можете вызвать как test()
для создания объекта класса). Компилятор и IDE заставляют вас это делать.
Правила супер-конструктора в какой-то степени усложняют этот вопрос.
Если вы определяете вторичный конструктор в производном классе без указания основного конструктора (без круглых скобок рядом с объявлением класса), тогда сам второй конструктор должен вызвать супер-конструктор, и в объявлении класса не должны указываться аргументы суперконструктора:
class test2 : test { // no arguments for `test` here constructor(a: Int) : super() { /* ... */ } }
Другой вариант – определить первичный конструктор и вызвать его из вторичного:
class test2() : test() { constructor(a: Int) : this() { /* ... */ } }