【发布时间】:2016-05-10 02:41:25
【问题描述】:
假设我有一个定义为接口的非常复杂的规范:
interface Spec {
fun sayHello()
}
还有一个标准的实现:
class Impl(private val msg: String) : Spec {
override fun sayHello() {
println(msg)
}
}
现在假设我想创建一个实现该规范并委托给实现的类,但确切的委托对象在对象的整个生命周期内是可变的。这是一个例子:
class Derived(var target: Spec) : Spec by target
上例的问题是构造函数调用时构造函数参数target被设置为委托对象。然后类直接访问委托,而不是执行属性访问。 (这已通过查看 Kotlin 生成的字节码得到证实。)
因此,即使在构造类之后修改了属性target,委托也不会改变。
任何人都可以提供一种在 Kotlin 中执行此委托的方法,而无需编写每个方法吗?
理想的解决方案还允许委托给像 lambda 或其他表达式这样通用的东西,只要在对象的整个生命周期中需要委托,就可以评估并用作委托。
【问题讨论】: