2017-02-20 46 views
5

Сгенерированный байт код для кода ниже создает поле private final Base $$delegate_0 в классе Derived. Когда назначается изменяемое поле b, исходный делегат не изменяется.В Котлине можно изменить делегирование в Runtime?

Есть ли способ изменить делегата во время выполнения при сохранении реализации zero boilerplate?

 
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 
} 

Образец взят из документации https://kotlinlang.org/docs/reference/delegation.html и отредактированных.

ответ

8

Нет, это не поддерживается в Котлине с версии 1.1, но это рассматривается на будущей версии. Это отслеживается this feature request.