科特林代表团的expression,而不是固定的参考

假设我有一个非常复杂的规范定义为一个接口:

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或其他expression式一样的东西,只要在对象的整个生命周期中需要委托,就会被评估和用作委托。

现在没有办法做到这一点。 见Kotlin问题KT-5870

Currenlty Kotlin在类初始化程序中为代表评估expression式

你可以添加一个间接的级别:

 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 } } 

不幸的是holder必须是一个构造参数才能与委托构造一起使用(Kotlin v1.0),所以它使主构造器变得复杂。