Пожалуйста, объясните делегатов по недвижимости - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь выучить Kotlin и TornadoFX.Одна вещь, которую я продолжаю видеть, это такой код:

val TextProperty = SimpleStringProperty()
var text by Textproperty

Я читал документацию

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

, поэтому я "поглощен"что они полезны, когда значения в модели меняются, но мне нужна дополнительная помощь, чтобы действительно понять концепцию.Кажется, что-то не щелкает.У кого-нибудь есть примеры, видео и т. Д., Которые демонстрируют цель и полезность этих делегатов собственности?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Важным моментом здесь является то, что JavaFX требует или, по крайней мере, предпочитает наблюдаемые свойства.Вместо объявления изменяемого свойства вы должны объявить один из типов свойств JavaFX, в зависимости от того, какой тип свойства вы хотите (String, Double, Int и т. Д.).Все, что вам действительно нужно, это объявить это свойство:

class Customer {
    val ageProperty = SimpleIntegerProperty()
}

Вы можете обойтись только этим, без использования каких-либо делегатов.Однако, если вы хотите изменить это свойство, вам нужно изменить свойство value внутри свойства, которое вы определили, поэтому код выглядит так:

customer.ageProperty.value = 42

Это громоздкотак что для простоты вы хотите добавить геттеры и сеттеры.Выполнение этого вручную будет выглядеть примерно так:

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 позволяют вам связывать с элементом пользовательского интерфейса, например, с текстовым полем.Изменения в текстовом поле будут записаны обратно в свойство, а изменения свойства будут записаны обратно в пользовательский интерфейс.

0 голосов
/ 22 мая 2018

Как только вы сможете написать что-то вроде

class C { var text by Textproperty }

, все c.text = blabla будут скомпилированы в TextProperty.setValue(c, ::text, blabla), а c.text - в TextProperty.getValue(c, ::text).Это позволяет библиотеке (провайдеру TextProperty) принимать на себя операции над text.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...