Как в примере:
class A {
var value: String
get() = "value"
set(value) { println(value) }
}
class B {
val a = A()
var value = a.value
}
fun main(args: Array<String>) {
B().value = "new value"
}
B.value
инициализируется только с A.value.get
, поэтому, конечно, A.value.set
не вызывается во время назначения в функции main
, и, следовательно, не выводит сообщение на консоль.
Я ищу синтаксис, который позволял бы пересылать функции get
и set
в новую переменную на основе свойства другого объекта того же типа.
Мне удалось реализовать такой делегат, но он опирается на библиотеку kotlin-рефлекса (вызывая getter
и setter
), и я хотел бы избежать этого:
import kotlin.reflect.KProperty
import kotlin.reflect.KMutableProperty
class Forward<T> (private val originalProperty: KProperty<T>){
operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
return originalProperty.getter.call()
}
}
class ForwardMutable<T> (private val originalProperty: KMutableProperty<T>){
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
originalProperty.setter.call(value)
}
operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
return originalProperty.getter.call()
}
}
fun <T> forward(originalProperty: KProperty<T>) = Forward(originalProperty)
fun <T> forward(originalProperty: KMutableProperty<T>) = ForwardMutable(originalProperty)
class A {
var value: String
get() = "value"
set(value) { println(value) }
}
class B {
val a = A()
var value by forward(a::value)
}
fun main(args: Array<String>) {
B().value = "new value" // calls A.value.setter
}
Нет ли для этой цели встроенного делегата? Если нет, как я могу избежать kotlin-reflect
зависимости?