假设我将一个非常复杂的规范定义为接口:
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或其他表达式一般的东西,只要在对象的整个生命周期中需要委托时,它就会被评估并用作委托。
答案 0 :(得分:6)
现在没有办法做到这一点。见Kotlin issue KT-5870
Currenlty Kotlin在类初始值设定项
中评估委托的表达式
答案 1 :(得分:0)
您可以添加间接级别:
"/Dev%d/PFI%d"
不幸的是class Holder(var impl: Spec) : Spec {
override fun sayHello() = impl.sayHello()
}
class Derived(target: Spec,
private val holder: Holder = Holder(target)) : Spec by holder {
fun changeTarget(newTarget: Spec) {
holder.impl = newTarget
}
}
必须是构造函数参数才能与委托构造一起使用(对于Kotlin v1.0),因此它会使主构造函数复杂化。