класс javafx.scene.Node имеет пару методов setUserData (Object) и Object getUserData ()
, которые вы могли бы использовать для добавления вашей информации в узел.
So , вы можете вызвать page.setUserData (info);
И контроллер может проверить, задана ли информация. Кроме того, вы можете использовать ObjectProperty для пересылки данных назад, если это необходимо.
Соблюдайте документацию здесь: http://docs.oracle.com/javafx/2/api/javafx/fxml /doc-files/introduction_to_fxml.html Перед фразой «В первой версии handleButtonAction () помечен с помощью @FXML, чтобы разрешить разметку, определенную в документе контроллера, вызвать ее. Во втором примере поле кнопки аннотируется, чтобы позволить загрузчику устанавливать его значение. Метод initialize () аналогично аннотируется. "
Итак, вам нужно связать контроллер с узлом и установить пользовательские данные для узла.
Трюк заключается в том, чтобы помнить, что данные private
относятся к классу, а не к экземпляру класса. Любой метод внутри вашего класса может получить доступ к личным данным любого экземпляра этого класса; не существует способа держать данные конфиденциальными внутри экземпляра, если вы не запрещаете методы, которые явно получают доступ к частным данным из других экземпляров.
Это несколько решение по выбору языка. В Ruby , например, private
действительно означает private, как в «только экземпляр может обращаться к своим собственным частным данным». Однако это несколько ограничивает.
Как указано в комментариях, конструкторы копирования и операторы присваивания являются общими местами, где вы напрямую обращаетесь к частным частным данным другого экземпляра. Есть менее очевидные причины.
Рассмотрим следующий случай. Вы реализуете связанный список OO. Связанный список имеет класс вложенных узлов для управления указателями. Вы можете реализовать этот класс узлов таким образом, чтобы он управлял самими указателями (вместо того, чтобы указатели были общедоступны и управлялись списком). В таком случае у вас будут объекты узлов, которые хотят изменить указатели других узлов объектов в других местах, которые типичны для конструктора копирования и оператора присваивания.
Так как это работает на C ++. В C ++ управление доступом работает на основе per-class , а не на основе каждого объекта.
Управление доступом в C ++ реализовано как статическая функция времени компиляции. Я думаю, что довольно очевидно, что на этапе компиляции реально невозможно реализовать какой-либо значимый контроль доступа к каждому объекту. Этот способ может быть реализован только для каждого класса.
Некоторые рекомендации по управлению объектами присутствуют в спецификации protected access , поэтому он даже имеет свою собственную выделенную главу в стандарт (11.5). Но все же описанные там характеристики каждого объекта довольно рудиментарны. Опять же, управление доступом на C ++ предназначено для работы на основе класса.
void X::f(X&x)
компилятор легко может различать this->a
и x.a
. Для компилятора не всегда (всегда) знать, что *this
и x
являются фактически одним и тем же объектом, если вызывается x.f(x)
, но я вполне мог видеть, что дизайнер языка находит это ОК.
– André Caron
3 August 2011 в 13:24
this
и &x
. Чтобы ухудшить это, на самом деле это проблема даже с X::f(Y& y)
, потому что наш конкретный объект может иметь тип Z
, который наследуется как от X
, так и от Y
. Короче говоря, это настоящий беспорядок, а не исполнительский, трудно работать с MI.
– Nir Friedman
4 April 2017 в 16:35
X::f(X& x)
, если есть доступ к x.a
, он не будет компилироваться. Ничего другого не меняется, никакие проверки не нужно вставлять, поэтому производительность программ с неизменными действиями не влияет. И это не предлагается как переломное изменение существующего C ++, а как то, что дизайнеры могли сделать при введении private
изначально.
– Alexey Romanov
15 February 2018 в 14:46
Это хороший вопрос, и я недавно столкнулся с этим вопросом. У меня были некоторые дискуссии с моими коллегами, и вот резюме нашего обсуждения: Это по дизайну. Это не означает, что этот дизайн является полностью разумным для всех случаев, но должны быть некоторые соображения, почему выбрано для каждого класса. Возможные причины, о которых мы могли подумать, включают:
. Прежде всего, стоимость контроля доступа к экземпляру может быть очень высокой. Об этом говорили другие в этой теме. Теоретически это можно сделать с помощью этой проверки указателя . Однако это невозможно сделать во время компиляции и может быть выполнено только во время выполнения. Таким образом, вам нужно определить контроль доступа каждого участника во время выполнения, а когда он будет нарушен, возможно, будут затронуты только исключения. Стоимость высокая.
Во-вторых, для контроля доступа к классу имеет свой собственный прецедент, например, конструктор копирования или оператор =. Было бы сложно реализовать их, если контроль доступа на один экземпляр.
Кроме того, управление доступом в основном связано с перспективой программирования / языка, как модулировать / управлять доступом к коду / члену, а не данных.
В дополнение ко всем приведенным выше ответам рассмотрите конструкторы специальных копий, операторы присваивания и все другие функции, которые вы должны написать для класса, которые работают с другими экземплярами . Вам понадобятся функции доступа для всех этих элементов данных.
«Частный» на самом деле не является механизмом контроля доступа в смысле «Я сделал свои фотографии на facebook частным, чтобы вы их не видели».
В C ++, «private» просто говорит, что это части класса, которые вы (кодер класса) могли бы изменить в будущих версиях и т. Д., И вы не хотите, чтобы другие кодеры, использующие ваш класс, полагались на их существование или функциональность.
Если вам нужен настоящий контроль доступа, вы должны внедрить подлинные методы защиты данных.
Частные данные остаются закрытыми до тех пор, пока кто-то, у кого есть доступ к нему, не обнаружит его другим.
Эта концепция применима и к другой ситуации, например:
class cMyClass
{
public:
// ...
// omitted for clarity
// ...
void Withdraw(int iAmount)
{
iTheSecretVault -= iAmount;
}
private:
int iTheSecretVault;
};
снимать деньги? :) [/ Д2]