有人知道在自己的基类中监听成员更改的更好方法吗?
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/