有没有人知道在自己的基类中监听成员变更的更好方法?
class FOO {
val t: String
}
class BOO: FOO {
fun x(val t: String) {
// notify when t was changed
}
}
在我看来,带有Observer的JavaRx将会很多 . Kotlin代表不使用继承(或者我找不到方法) . 我想出的最好的是在“BOO”中覆盖“t”的setter和getter . 但这有点尴尬因为这个“我为什么要覆盖一个成员?”或者“为什么我必须定义集合并在需要设置时获取?”
到目前为止我的解决方案:
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
}
}
3 Answers
为什么不简单地重写?像这儿:
我在这里看到的唯一缺点是需要明确地覆盖getter,但这只是一个额外的行 .
UPDATE:
我个人认为它看起来有点奇怪,但如果你所追求的不需要覆盖任何成员(字段或方法),那么你可以使你的
onChange
方法成为一个属性:类似的方法,但有
Delegates.observable()
,见Language reference: