Пользовательский вид с приватным первичным конструктором - PullRequest
1 голос
/ 07 июня 2019

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

Рассмотрим эту настройку:

interface LoginFeatureCapabilities {
   fun login(): Boolean
}

class LoginFeatureImpl: LoginFeatureCapabilities {
   override fun login() = ...
}

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

class CustomView @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0,
    val loginFeatureImpl: LoginFeatureImpl = LoginFeatureImpl()
): View(context), LoginFeatureCapabilities by loginFeatureImpl

Это вызываетпредставление будет нулевым, а приложение - аварийным - в журналах нет конкретной ошибки.

Добавление частного конструктора также не помогает:

class CustomView private constructor(
    context: Context,
    val loginFeatureImpl: LoginFeatureImpl = LoginFeatureImpl()
): View(context), LoginFeatureCapabilities by loginFeatureImpl {

    @JvmOverloads constructor(
        context: Context, 
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ): this(context, LoginFeatureImpl())

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...