Kotlin 通过关键字 by 实现委托。
类委托
类的委托即一个类中定义的方法实际是调用另一个类的对象的方法来实现的。
fun main() {
val b = BaseImpl(20)
Derived(b).print()
}
// 创建接口
interface Base {
fun print()
}
// 实现此接口的被委托的类
class BaseImpl(val x: Int) : Base {
override fun print() {
print(x)
}
}
// 通过关键字 by 建立委托类
class Derived(b: Base) : Base by b
输出结果:
20
属性委托
属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理。
val/var <属性名>: <类型> by <表达式>
- var/val:属性类型(可变/只读)
- 属性名:属性名称
- 类型:属性的数据类型
- 表达式:委托代理类
fun main() {
val e = Example()
println(e.p)
e.p = "Kevin"
println(e.p)
}
class Example {
var p: String by Delegate()
}
// 委托的类
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, 这里委托了 ${property.name} 属性"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef 的 ${property.name} 属性赋值为 $value")
}
}
输出结果:
Example@246b179d, 这里委托了 p 属性
Example@246b179d 的 p 属性赋值为 Kevin
Example@246b179d, 这里委托了 p 属性
lazy 函数
1. 基本语法
val p by lazy {...}
说明:by 是 kotlin 的关键字,lazy 在这里只是一个高阶函数。在 lazy 函数中会创建并返回一个 Delegate 对象,当我们调用 p 属性的时候,其实调用的是 Delegate 对象的 getValue() 方法。
2. 实现 lazy 函数
- 新建 Later.kt 文件,编写如下代码:
class Later<T>(val block:() -> T) {
var value: Any? = null
operator fun getValue(any:Any?,prop:KProperty<*>): T {
if (value == null) {
value = block()
}
return value as T
}
}
fun <T> later(block:() -> T) = Later(block)
网友评论