Честно говоря, я не думаю, что стоит делать это, используя ключевое слово делегирования by
.Вместо этого я просто храню private var
для A
внутри A1
и вручную перенаправляю вызовы.Что-то вроде:
class A1 : A {
private var aDelegate: A
init {
aDelegate = if (condition) B1() else C1()
}
override fun test() {
aDelegate.test()
}
}
Тем не менее, есть вариант, который вы можете использовать, хотя я не обязательно рекомендую его.Он требует всплытия настраиваемой изменяемой реализации A
для вызывающих абонентов A1
, но остается необязательным, так что его не нужно использовать:
class MutableA(var aDelegate: A = EmptyA()) : A {
override fun test() {
aDelegate.test()
}
class EmptyA : A {
override fun test() { }
}
}
class A1(private val mutableA: MutableA = MutableA()) : A by delegate {
init {
mutableA.aDelegate = if (condition) B1() else C1()
}
}
Так что вы можете инициализировать его какнапример, как:
class A1(flag: Boolean, private val mutableA: MutableA = MutableA()) : A by delegate {
init {
mutableA.aDelegate = if (flag) B1() else C1()
}
}
fun main() {
A1(true).test() // prints "B1"
A1(false).test() // prints "C1"
}