Есть ли способ наследовать конструкторы в Kotlin? - PullRequest
2 голосов
/ 12 апреля 2019

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

open class Parent(arg1: Any, arg2: Any, arg3: Any...)

class ChildA(arg1: Any, arg2: Any, arg3: Any...): Parent(arg1, arg2, arg3...)
class ChildB(arg1: Any, arg2: Any, arg3: Any...): Parent(arg1, arg2, arg3...)
[...]

Есть лиспособ унаследовать конструктор или, возможно, функцию, реализованную в Parent, которая создает экземпляр Child класса?

Edit

Я надеюсь реализовать классы Child без необходимостиопределить его конструктор.Причина в том, что у меня около 15 дочерних элементов, и у каждого параметра есть необязательное значение, поэтому полученный код не так хорош.

1 Ответ

1 голос
/ 12 апреля 2019

Если он всегда один и тот же (или только расширенный), вы можете создать класс для хранения параметров:

data class ConstructorParams(arg1: Any, arg2: Any, arg3: Any...)

open class Parent(params: ConstructorParams)

class ChildA(params: ConstructorParams) : Parent(params)

class ChildB(params: ConstructorParams, extraParam: Int) : Parent(params)

Вы можете добавить к нему вспомогательную функцию, чтобы избежать явного ConstructorParams при создании экземпляраклассы, но он имеет компромисс производительности (хотя эта версия не будет работать для Child2):

inline fun <reified T : Parent> create(arg1: Any, arg2: Any, arg3: Any...) = 
    T::class.primaryConstructor.call(ConstructorParams(arg1, arg2, ...))

create<Parent>(1, 2, "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...