Kotlin Reference: Delegation

  实践证明,委托模式(Delegation Pattern)是实现继承的一种有效的替代方式,Kotlin 原生支持委托模式,不需要任何样板代码。下面的代码中,Derived 类实现了接口 Base,并将其所有的公有方法委托给了一个特定的对象:

[code lang=”kotlin”]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) {
val b = BaseImpl(10)
Derived(b).print() // prints 10
}[/code]

  Derived 类的超类列表中的 by 子句表示 b 将被保存到 Derived 对象的内部,编译器会生成 Base 的所有方法并转发给 b

  注意覆盖(Override)在这里照常生效,编译器会使用你覆盖的实现,而不是委托对象中的实现,如果我们为 Derived 加入 override fun print() { print("abc") },则上面的代码会打印“abc”而不是“10”。