一般的には、明示的getValue(...)
とsetValue(...)
関数でプロパティの振る舞いを提供する、property delegate自分自身を実装することができます。
あなたがプロパティの変更(のようなobservable
以上vetoable
)の例を観察し、デリゲートを実装することができます抽象クラスを使用、あなたのタスクを簡素化するために:あなたの便宜のために
var foo: String by object : ObservableProperty<String>("bar") {
override fun beforeChange(property: KProperty<*>, oldValue: String, newValue: String): Boolean {
baz.prepareToDoTheThing()
return true // return false if you don't want the change
}
override fun afterChange(property: KProperty<*>, oldValue: String, newValue: String) {
baz.doTheThing()
}
}
を、あなたが作成する関数を書くことができますデリゲートオブジェクト:
fun <T> observing(initialValue: T,
willSet:() -> Unit = { },
didSet:() -> Unit = { }
) = object : ObservableProperty<T>(initialValue) {
override fun beforeChange(property: KProperty<*>, oldValue: T, newValue: T): Boolean =
true.apply { willSet() }
override fun afterChange(property: KProperty<*>, oldValue: T, newValue: T) = didSet()
}
は、次に、あなただけの彼らのためにwillSet
とdidSet
(the default argumentとしてそれにラムダを渡します{ }
)。使用法:いずれの場合で
var foo: String by observing("bar", willSet = {
baz.prepareToDoTheThing()
}, didSet = {
baz.doTheThing()
})
var baq: String by observing("bar", didSet = { println(baq) })
驚いたことに、この2番目のアプローチは、私が質問している間に構築していた回避策です。 :D – Supuhstar
@ Suuphstar、うれしいことにあなたはうれしいです。:) – hotkey
@hotkeyそれを実装する最も効率的な方法であるので、カスタムセッターをちょっと詳しく説明する必要があります。 –