是否可以动态更改实例的方法?

时间:2018-01-22 13:05:37

标签: kotlin

我写下了这段代码:

open class Test(){
    override fun toString(): String {
        return "This is test!"
    }
}


fun createTestX(): Test {
    return object : Test() {
        override fun toString(): String {
            return super.toString() + "XXX"
        }
    }

}

fun main(args: Array<String>) {
    val x = createTestX()
    println(x)
}

它按预期工作但我很好奇是否可以使用例如lambda来改变实例的方法:

val x = Test()
x.toString = () -> x.toString() + "XXX"

1 个答案:

答案 0 :(得分:4)

你能做什么

class C {
    var example:()->String = this::toString
}

fun main(args: Array<String>) {
    val c = C()
    println(c.example())
    c.example = {"ABCDEF"}
    println(c.example())
}

限制

虽然这适用于交换字段,但您无法使用它来覆盖方法。这可以通过定义调用字段的方法来解决。

class C {
    var example:()->String = {"ABC"}

    override fun toString() = example()
}

fun main(args: Array<String>) {
    val c = C()
    println(c)
    c.example = {"DEF"}
    println(c)
}

输出:

ABC
DEF