在Kotlin中,可以在运行时更改委派吗?
为以下代码生成的字节码在Derived
类中创建一个private final Base $$delegate_0
字段.分配了可变字段b
后,原始委托不会更改.
The generated byte code for the below code creates a private final Base $$delegate_0
field in the Derived
class. When the mutable field b
is assigned the original delegate does not change.
是否有一种在保持zero boilerplate
实现的同时在运行时更改委托的方法?
Is there a way to change the delegate at runtime while keeping the zero boilerplate
implementation?
interface Base {
fun print()
}
class BaseImpl(val x: Int) : Base {
override fun print() { println(x) }
}
class Derived(var b: Base) : Base by b
fun main(args: Array) {
val b = BaseImpl(10)
val derived = Derived(b)
derived.print()// prints 10
derived.b = BaseImpl(20)
derived.print()// prints 10
}
该示例摘自docs https://kotlinlang.org/docs/reference/delegation .html 并进行了编辑.
The sample is taken from the docs https://kotlinlang.org/docs/reference/delegation.html and edited.
否,Kotlin从1.1版开始不支持此功能,但是正在考虑将其用于将来的版本.这是由此功能请求跟踪的.
No, this is not supported in Kotlin as of version 1.1, but this is under consideration for a future version. This is tracked by this feature request.