您可以将房产委托给Kotlin的另一处房产吗?我有以下代码:
class SettingsPage {
lateinit var tagCharacters: JTextField
lateinit var tagForegroundColorChooser: ColorPanel
lateinit var tagBackgroundColorChooser: ColorPanel
var allowedChars: String
get() = tagCharacters.text
set(value) = tagCharacters.setText(value)
var tagForegroundColor by tagForegroundColorChooser
var tagBackgroundColor by tagBackgroundColorChooser
}
Run Code Online (Sandbox Code Playgroud)
为了获得属性委托,我声明了以下两个扩展函数:
operator fun ColorPanel.getValue(a: SettingsPage, p: KProperty<*>) = selectedColor
operator fun ColorPanel.setValue(a: SettingsPage, p: KProperty<*>, c: Color?) { selectedColor = c }
Run Code Online (Sandbox Code Playgroud)
但是,我想写的内容如下:
class SettingsPage {
lateinit var tagCharacters: JTextField
lateinit var tagForegroundColorChooser: ColorPanel
lateinit var tagBackgroundColorChooser: ColorPanel
var allowedChars: String by Alias(tagCharacters.text)
var tagForegroundColor by Alias(tagForegroundColorChooser.selectedColor)
var tagBackgroundColor by Alias(tagBackgroundColorChooser.selectedColor)
}
Run Code Online (Sandbox Code Playgroud)
这可能做Kotlin吗?我怎么写课Alias?
hot*_*key 14
是的,有可能:您可以对存储在别名中的属性使用绑定的可调用引用,然后Alias实现将如下所示:
class Alias<T>(val delegate: KMutableProperty0<T>) {
operator fun getValue(thisRef: Any?, property: KProperty<*>): T =
delegate.get()
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
delegate.set(value)
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
class Container(var x: Int)
class Foo {
var container = Container(1)
var x by Alias(container::x)
}
Run Code Online (Sandbox Code Playgroud)
要引用同一实例的属性,请使用this::someProperty.
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |