成为委派属性的条件
对于只读属性(val),委派属性需要提供一个函数名叫getValue,并包含以下参数:
thisRef --必须与属性类型一致或是其超类
property --必须是KProperty<*>或它的超类
这个方法必须返回与属性一致的类型或其子类型。
对于可变属性(var),委派属性需要提供一个额外的方法setValue,并包含以下参数:
- thisRef -- 与getValue一致
- property -- 与getValue一致
- new value -- 必须与属性类型一致或它的超类
getValue()和setValue()方法可能提供委派类的成员函数或扩展函数。当你需要委派对象属性,但是属性并没有提供相关函数时,扩展函数是很方便的。getValue()和setValue()方法都需要使用operator关键字标记。
委派类可以实现以下接口ReadOnlyProperty和ReadWriteProperty。
interface ReadOnlyProperty<in R, out T> {
operator fun getValue(thisRef: R, property: KProperty<*>): T
}
interface ReadWriteProperty<in R, T> {
operator fun getValue(thisRef: R, property: KProperty<*>): T
operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}