inheritance - Kotlin 覆盖成员集并获取

标签 inheritance setter kotlin overwrite

有人知道在自己的基类中监听成员更改的更好方法吗?

class FOO {
    val t: String
}

class BOO: FOO {
    fun x(val t: String) {
        // notify when t was changed 
    }
}

在我看来,JavaRx 和 Observer 就太多了。 Kotlin Delegate 不适用于继承(或者我还找不到方法)。我想出的最好的方法是覆盖“BOO”中“t”的 setter 和 getter。但这有点尴尬,因为“我为什么要覆盖成员?”或“为什么我必须定义 set 并在我只需要 set 时获取?”

所以到目前为止我的解决方案:
import kotlin.properties.Delegates

fun main(args: Array<String>) {
    var foo = FOO()
    foo.t = "foo"
    foo.printT()

    var boo = BOO()
    boo.t = "boo"
    boo.printT()
}

open class FOO () {
    open var t: String? = "origin"
    set(value) {
        println("\t origin setter is called")
        field = String() + value // create a copy (original it is not a String :D)
    }
    get() {
        println("\t origin getter is called")
        return field
    }

    fun printT() = println(t)
}


class BOO (): FOO () {
    override var t: String?
    set(value) {
        // thats all what i need
        println("\t overwritten setter is called")
        super.t = value // execute origin setter
    }
    get() {
        println("\t overwritten getter is called")
        return super.t
    }
}

最佳答案

open class FOO {
    var t: String = "origin"
        set(value) {
            field = value
            x(t)
        }

    open fun x(t: String) {
        println("FOO: t=$t")
    }
}

open class BOO : FOO() {
    override fun x(t: String) {
        super.x(t)
        println("BOO: t=$t")
    }
}

更新:

我个人认为它看起来有点奇怪,但如果你所追求的不需要覆盖任何成员(字段或方法),那么你可以让你的 onChange方法一个属性:
open class FOO(val onChange: (t: String) -> Unit = FOO.defaultOnChange) {
    companion object {
        val defaultOnChange: (t: String) -> Unit = { println("FOO: t=$it") }
    }

    var t: String = "origin"
        set(value) {
            field = value
            onChange(t)
        }
}

open class BOO : FOO({ defaultOnChange(it); println("BOO: t=$it") })

关于inheritance - Kotlin 覆盖成员集并获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36068033/

相关文章:

unit-testing - Kotlin-multiplatform:如何执行 iOS 单元测试

java - 如何从合约状态获取stateAndRef?

java - super 在下面的代码中是如何工作的? ( java )

java - 将 Java 构造函数/方法标记为不供客户端使用的首选方法?

c# - 使用 MVVM 模式时,与属性更改相关的代码应该放在 setter 还是事件中?

c# - Style Setter 中的 UWP 绑定(bind)不起作用

android - Jetpack Compose TextField 捕获键盘 Enter-input

c++ - 为什么operator=()函数不能被派生类继承

css - 理解css继承currentColor

c++ - 为什么孙类的父类不处理祖类的初始化?