У нас есть пользовательское представление, через которое мы хотели бы предоставить 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())
}
Можно ли сохранитьссылка на экземпляр, который делегирован в пользовательском представлении?