原文链接
在kotlin中,从用法上来说委托有以下类型:
- 类委托
- 属性委托
- 标准库提供的委托
实际上标准库提供的委托就是kotlin帮我们实现好一些的属性委托。
类委托
类委托有三个对象:
- 定义业务方法的接口
- 实现接口的委托对象
- 实现接口的被委托对象
当委托对象委托给被委托对象时(koltin中通过 by 修饰),调用委托对象中实现了的接口相关方法,将由被委托对象代为处理。
类委托可以看成是一种实现继承的快捷方式,委托对象相当于父类,而被委托对象相当于这个父类的子类,当委托对象委托给被委托对象时,就相当于把子类实例赋值给父类对象,这时候调用父类中的方法会调用子类实例实现的方法。
属性委托
有一些常见的属性类型,我们可能会在每次需要的时候重复手动实现,对于这种场景可以使用属性委托
class Test {
// 属性委托
var prop: String by Delegate()
}
属性委托的语法
val/var <属性名>: <类型> by <表达式>
属性委托和类委托的区别在于,委托角色从委托对象变成了委托属性,被代理的逻辑变成了这个属性的 get/set
方法,即被委托类仅仅是覆盖这个属性的 get/set
方法。
Kotlin 标准库中声明了2个含所需 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)
}
如果想快速实现属性委托,可以继承上面接口自定义类实现。
kotlin 标准库中提供几个委托
- 延迟属性
- 可观察属性
- 把多个属性存储到一个映射(map)中,而不是每个存在单独的字段中。