参考原文:http://kotlinlang.org/docs/reference/delegation.html
类代理(Class Delegation)
代理模式提供一种实现继承的替代方式,Kotlin原生就支持代理模块。
如下,“Derived
”继承“Base
”接口,并代理了它的全部公共方法:
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { print(x) }
}
class Derived(b: Base) : Base by b
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).print() // prints 10
}
通过“by”关键字,将“b”实例存储到Derived对象中,编译器会生成“Base
”接口的所有方法,使用“b”的实现。
代理属性(Delegated Properties)
对于很多公用属性,尽管在每次需要的时候可以通过手动实现;更好的方式是一次实现多次使用,并放到一个库(library)。
比如,有下面类型的属性:
Ø 延迟属性(lazy properties):只有第一次访问时才会计算值。
Ø 观察属性(observable properties):当该属性发生改变时,会通知监听者。
Ø map中存储属性,不是在单独的字段中。
在Kotlin中,为了满足上面几种情况,提供了代理属性( delegated properties):
class Example {