【发布时间】:2019-09-04 00:39:20
【问题描述】:
如示例:
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-reflect 库(调用 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 依赖?
【问题讨论】:
标签: generics kotlin reflection delegates