将属性委托给另一个属性

你可以将一个物业委托给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 } 

为了获得财产授权,我宣布了以下两个扩展功能:

  operator fun ColorPanel.getValue(a: SettingsPage, p: KProperty<*>) = selectedColor operator fun ColorPanel.setValue(a: SettingsPage, p: KProperty<*>, c: Color?) { selectedColor = c } 

不过,我想写的是如下所示:

 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) } 

这可能做Kotlin? 我如何编写类Alias

是的,这是可能的:您可以使用绑定的可调用引用来存储别名中存储的属性,然后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) } } 

用法:

 class Container(var x: Int) class Foo { var container = Container(1) var x by Alias(container::x) } 

要引用同一个实例的属性,请使用this::someProperty

如果您希望在Kotlin中查看对财产参考的支持,请进行投票并跟踪此问题的更新: https : //youtrack.jetbrains.com/issue/KT-8658