- Kotlin代码实现属性委托:
class DelegateClass(val value: String)
class DelegatingClass {
var delegatedProperty: String by Delegate()
}
class Delegate {
private var delegate: DelegateClass? = null
operator fun getValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>): String {
require(delegate != null) { "Delegate is not initialized" }
return delegate!!.value
}
operator fun setValue(thisRef: Any?, property: kotlin.reflect.KProperty<*>, value: String) {
if (delegate == null) {
delegate = DelegateClass(value)
} else {
delegate!!.value = value
}
}
}
- 委托类中需要实现的方法:
getValue(thisRef: Any?, property: KProperty<*>): T
:用于获取委托属性的值。其中thisRef
是委托属性所在的对象实例(在Kotlin中,thisRef
在非扩展属性委托中可以是Any?
,如果是扩展属性委托,thisRef
就是扩展的对象类型),property
包含委托属性的元数据,返回值T
是委托属性的类型。
setValue(thisRef: Any?, property: KProperty<*>, value: T)
:用于设置委托属性的值。参数thisRef
和property
含义同上,value
是要设置的新值。这个方法只有在委托的属性是可变的(即使用var
声明)时才需要实现。