в GObject of glib меня смущает, что объект экземпляра подкласса, производный от родительского класса, наследует свойства родительского класса или нет?

первая проблема:
в GObject я не понимаю, наследует ли экземпляр объекта подкласса, производного от родительского класса, свойства родительского класса или нет?
< em>вторая проблема:
в GObject функция g_object_class_install_properties добавляет свойства в свой класс в функции инициализации класса, но на самом деле эти свойства для каждого экземпляра объекта класса имеют копию. Другими словами, каждый объект экземпляра класса имеет копию этих свойств.

кроме того, я прочитал фрагмент кода GObject. в приведенном ниже коде в файле Gobject.c:

class->set_property = g_object_do_set_property;
class->get_property = g_object_do_get_property;

во-первых когда вызываются вышеуказанные функции?
во-вторых если подкласс происходит от родительского класса, то подкласс переопределяет эти методы ( set_property и get_property), то, если g_object_new создает новый экземпляр подкласса и устанавливает значение свойства, вызывается только функция обратного вызова set_property, вызывает ли он после вызова set_property подкласса метод set_property родительского класса или нет?
Я не знаю, что только после этого вызывая одновременно set_property подкласса, вызывается ли метод set_property родительского класса одновременно?

если вы знаете эти проблемы, пожалуйста, потратьте время на ответы на мои вопросы, заранее большое спасибо.


person zhang007z    schedule 31.12.2015    source источник


Ответы (1)


Если вы еще не видели сайт GNOME Developer , в нем есть несколько страниц с полезной информацией, относящейся к заданным вами вопросам. Ссылки, указанные ниже, содержат очень простой пример кода, за которым следуют очень подробные описания того, что происходит в коде. Примеры страниц, которые я процитировал (и связал) ниже, конкретно отвечают на ваши вопросы, но гораздо больше контента по этой теме доступно на соседних страницах.

Первый выпуск:

Производные типы могут быть далее разделены на подклассы, а их структуры классов и экземпляров являются частью общедоступного API, который нельзя изменять, если важна стабильность API. Они объявляются с использованием G_DECLARE_DERIVABLE_TYPE:

См. примеры здесь: G_DECLARE_DERIVABLE_TYPE()

Второй вопрос:

общий механизм получения/установки свойств объекта. Когда создается экземпляр объекта, следует использовать обработчик class_init объекта для регистрации свойств объекта с помощью g_object_class_install_properties.

См. примеры здесь: Свойства объекта

Я полагаю, что ваш конкретный вопрос:
когда вызываются вышеуказанные функции?
очень подробно рассматривается в этих и окружающих абзацах в ссылке Свойства объекта выше:

Если для GValue пользователя установлено допустимое значение, g_object_set_property продолжил бы вызов метода класса set_property объекта. Здесь, поскольку наша реализация Foo переопределяла этот метод, выполнение перешло к foo_set_property после извлечения из GParamSpec param_id [4], который был сохранен g_object_class_install_property.

Как только свойство было установлено методом класса set_property объекта, выполнение возвращается к g_object_set_property, что гарантирует отправку сигнала "уведомления" экземпляру объекта с измененным свойством как параметр, если только уведомления не были заморожены g_object_freeze_notify.

person ryyker    schedule 31.12.2015