有可能改变一个实例的动态方法?
我写下了这个代码:
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) { val x = createTestX() println(x) }
它按预期的方式工作,但我很好奇是否可以使用例如lambda来更改实例的方法,如下所示:
val x = Test() x.toString = () -> x.toString() + "XXX"
你可以做什么
class C { var example:()->String = this::toString } fun main(args: Array) { 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) { val c = C() println(c) c.example = {"DEF"} println(c) }
输出:
ABC DEF