import kotlin.reflect.KProperty class Delegate { var inner = Derived() operator fun getValue(t: Any?, p: KProperty<*>): Derived { inner = Derived(inner.a + "-get") return inner } operator fun setValue(t: Any?, p: KProperty<*>, i: Base) { inner = Derived(inner.a + "-" + i.a + "-set") } } class A { var prop: Derived by Delegate() } fun box(): String { val c = A() if(c.prop.a != "derived-get") return "fail get ${c.prop.a}" c.prop = Derived() if (c.prop.a != "derived-get-derived-set-get") return "fail set ${c.prop.a}" return "OK" } open class Base(open val a: String = "base") class Derived(override val a: String = "derived"): Base()