【问题标题】:Please Explain Property Delegates请解释物业代表
【发布时间】:2020-04-12 20:27:23
【问题描述】:

我正在尝试学习 Kotlin 和 TornadoFX。我一直看到的一件事是这样的代码:

val TextProperty = SimpleStringProperty()
var text by Textproperty

我一直在阅读文档

https://edvin.gitbooks.io/tornadofx-guide/content/part2/Property%20Delegates.html

所以我已经“吸收”了它们在模型中的值发生变化时很有用,但我需要进一步的帮助才能真正掌握这个概念。似乎没有什么东西在点击。有没有人有任何示例、视频等来展示这些属性委托的目的和有用性?

【问题讨论】:

    标签: kotlin tornadofx


    【解决方案1】:

    这里的重点是 JavaFX 需要或至少更喜欢可观察的属性。您可以声明一种 JavaFX 属性类型,而不是声明可变属性,具体取决于您想要的属性类型(String、Double、Int 等)。你真正需要的是声明这个属性:

    class Customer {
        val ageProperty = SimpleIntegerProperty()
    }
    

    您无需使用任何委托即可解决此问题。但是,如果你想改变这个属性,你需要改变你定义的属性里面的value属性,所以代码看起来是这样的:

    customer.ageProperty.value = 42

    这很麻烦,所以为了简单起见,您需要添加 getter 和 setter。手动执行此操作看起来像这样:

    val ageProperty = SimpleIntegerProperty()
        var age: Int
            get() = ageProperty.value
            set(value) { ageProperty.value = value }
    

    现在您可以像这样设置Customer 的年龄:

    customer.age = 42

    这更方便,但您必须为每个属性声明所有代码,因此在 TornadoFX 中我们引入了属性委托,它通过一个简单的语句来处理所有这些,所以:

    val ageProperty = SimpleIntegerProperty()
    var age by ageProperty
    

    最终结果是相同的,您无需做任何繁重的工作。

    为了清楚起见,这解释了属性委托,而不是为什么 JavaFX 属性有用。 JavaFX 属性允许您绑定到 UI 元素,例如文本字段。对文本字段的更改将被写回属性,对属性的更改将被写回 UI。

    【讨论】:

      【解决方案2】:

      一旦你可以写出类似的东西

      class C { var text by Textproperty }
      

      所有c.text = blabla 将编译为TextProperty.setValue(c, ::text, blabla)c.text 将编译为TextProperty.getValue(c, ::text)。这使得库(TextProperty 的提供者)能够接管text 上的操作。

      参考:https://kotlinlang.org/docs/reference/delegated-properties.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-13
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多