将财产委托给另一个财产

bre*_*dan 7 kotlin

您可以将房产委托给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.

  • @Breandan:`operator fun &lt;T&gt; KProperty0&lt;T&gt;.getValue(thisRef: Any?, property: KProperty&lt;*&gt;) = get(); operator fun &lt;T&gt; KMutableProperty0&lt;T&gt;.setValue(thisRef: Any?, property: KProperty&lt;*&gt;, value: T) = set(value);` (2认同)
  • 谢谢!不幸的是,这不支持从Java类到合成属性的委派。使用tagBackgroundColorChooser :: selectedColor通过var tagBackgroundColor在原始示例中定义这些扩展会导致错误,不支持[对Java get / set方法的综合扩展属性的引用]。 (2认同)