2017-02-20 6 views
5

Wygenerowany kod bajtu dla poniższego kodu tworzy pole private final Base $$delegate_0 klasy . Po przypisaniu zmiennego pola b oryginalny delegat nie zmienia się.Czy w Kotlinie można zmienić delegację w Runtime?

Czy istnieje sposób zmiany delegata w czasie wykonywania, zachowując implementację 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 
} 

Próbka jest pobierana z docs https://kotlinlang.org/docs/reference/delegation.html i edytowane.

Odpowiedz

8

Nie, nie jest to obsługiwane w wersji Kotlin od wersji 1.1, ale jest to brane pod uwagę w przypadku przyszłej wersji. Jest to śledzone przez this feature request.