У меня есть класс под названием A:
open class A (a: String, b: String, c: String)
И класс B, который расширяет A:
class B(a: String, b: String, c: String, d: String) : A(a, b, c)
Мой вопрос в том, есть ли способ сделать что-то подобное, чтобы не объявлять все параметры A внутри конструктора B:
class B(super, d:String) : A(super)
Если нет, должно быть =)
Вы можете создать общий интерфейс для классов, а затем использовать делегацию, чтобы приблизиться к тому, что вы хотите. Как это:
interface C { val a: String val b: String val c: String } class A(override val a: String, override val b: String, override val c: String) : C class B(c: C, val d: String) : C by c
Сделав это, вы можете создать экземпляр B
следующим образом:
val b = B(A("1", "2", "3"), "4")
Нет , Kotlin не содержит никакой конструкции, которая позволяет упростить параметры конструктора, соответствующие параметрам суперкласса.
Я не думаю, что согласен с тем, что это должна быть особенность языка, но я бы рекомендовал начать разговор на YouTrack, если вы считаете, что это должно быть.
Когда вы сталкиваетесь с этой проблемой, вы должны спросить себя, почему такой класс нуждается во многих параметрах / зависимостях, а не в поиске решения по синтаксису языка. Может быть, его ответственность неясна.
ЕСЛИ существует много доменных понятий, смешанных в классе, тогда вам необходимо пересмотреть свои классы, как показано ниже:
data class C(val a: String, val b: String, val c: String) open class A(val c:C) class B(c:C, val d: String) : A(c)
ЕСЛИ вы нашли B
not is-A A
, тогда вы должны использовать композицию, а не наследование, например:
open class A (a: String, b: String, c: String) class B(val a:A, val d: String)
Нет, нет такого пути. К сожалению, вам нужно сделать это вручную