| |
Справочное описание GObject |
---|
Люди часто запутываются пытаясь конструировать собственный объект GObjects, из-за множества разных способов монтирования в процессе конструирования объекта: трудно сформулировать который является правильным, рекомендованным способом.
Table 4, “g_object_new” показывает что функции обеспечиваемые пользователем вызываются в течение инстанциации объекта и в каком порядке они вызываются. Пользователь ищущий эквивалент простой функции конструктора C++ должен использовать instance_init метод. Он будет вызван после всех родительских функций instance_init. Эта функция не принимает произвольных параметров конструирования (как в C++), но если ваш объект нуждается в произвольных параметрах для завершения инициализации, вы можете использовать свойства конструирования.
Свойства конструкции будут установлены только после всех выполненных функций instance_init.
Ссылка объекта не будет возвращена клиенту g_object_new>
пока не будут установлены все свойства конструкции.
Также, я рекомендовал бы сначала писать следующий код:
static void maman_bar_init (GTypeInstance *instance, gpointer g_class) { MamanBar *self = (MamanBar *)instance; self->private = g_new0 (MamanBarPrivate, 1); /* Инициализируем все общие и закрытые члены в разумные значения по умолчанию. */ /* Если вам нужно специфичное свойство конструирования для завершения инициализации, * инициализация задерживается пока не установлено свойство. */ }
Убедитесь что вы установили maman_bar_init
как типовую функцию instance_init
в maman_bar_get_type
. Убедитесь что код собирается и выполняется: создайте экземпляр объекта и
убедитесь что maman_bar_init
вызывается (добавьте в него вызов
g_print
).
Теперь, если вам нужны специальные свойства конструирования, установите свойства в функцию class_init, отмените установленные и полученные методы и реализуйте получение и установку методов как описано в the section called “Object properties”. Убедитесь что эти свойства используются только конструируя GParamSpec, установив флаговое поле спецификации параметра в значение G_PARAM_CONSTRUCT_ONLY: это поможет GType убедится что свойства не установятся позже снова злонамеренным пользовательским кодом.
static void bar_class_init (MamanBarClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GParamSpec *maman_param_spec; gobject_class->set_property = bar_set_property; gobject_class->get_property = bar_get_property; maman_param_spec = g_param_spec_string ("maman", "Maman construct prop", "Set maman's name", "no-name-set" /* default value */, G_PARAM_CONSTRUCT_ONLY |G_PARAM_READWRITE); g_object_class_install_property (gobject_class, PROP_MAMAN, maman_param_spec); }
Если вам это нужно, убедитесь что вы можете собрать и запустить код подобный коду показанному выше.
Убедитесь что ваши конструкционные свойства могут правильно устанавливаться в течение конструирования,
убедитесь что вы не можете установить их впоследствие и убедитесь что без вызова
g_object_new
с необходимыми свойствами конструирования, они будут инициализированы значениями по умолчанию.
Я думаю что правильно останавливать выполнение программы если конструкционное свойство установлено в значение по умолчанию. Это позволит вам перехватить клиентский код который не предаёт разумное значение свойствам конструирования. Конечно вы можете не согласиться с этим, но вы должны иметь для этого веские причины.
Некоторые люди иногда нуждаются в конструировании собственных объектов, но только после установки конструкционных свойств. Это возможно благодаря использованию классовому методу конструирования как описано в the section called “Object instanciation”. Однако, я не вижу никаких разумных причин использовать эту особенность. Также, для инициализации вашего экземпляра объекта, используйте функцию base_init и конструкционные свойства по умолчанию.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |