Инстанциация объекта
Last updated
Was this helpful?
Last updated
Was this helpful?
Семейство функций могут использоваться для инстанциации любого GType который наследует основной тип GObject. Все эти функции проверяют класс и экземпляр сструктуры на правильную инициализацию в системе типов glib и вызывают один за другим метод конструктора класса, который используется для:
Распределение и очистка памяти с помощью ,
Инициализацию экземпляра объекта с созданными свойствами.
Хотя можно устанавливать класс и члены объекта (кроме полей указывающих на родителей) в нули, некоторые считают хорошей практикой установку явных значений для них.
Объекты которые наследуют GObject позволяют переписывать этот метод создания класса: однако перед этим, они должны привязываться к их родительскому методу конструктора:
Например ниже показано как MamanBar перезаписывает родительский конструктор:
Если пользователь инстанциирует объект MamanBar с помощью:
Если это первая инстанциация такого объекта, функция maman_b_class_init
будет вызвана после любой функции maman_b_base_class_init
. Это позволит убедиться в том, что структура класса этого нового объекта правильно инициализирована. Здесь maman_bar_class_init
как ожидается отменит объектные методы класса и установит собственные. В примере выше, метод конструктора единственный отменённый метод: он устанавливается в maman_bar_constructor
.
Время вызова
Вызываемая функция
Параметры функции
Ремарка
функция base_init целевого типа
В дереве иерархии классов из базового типа в целевой тип. base_init вызывается один раз для каждой сструктуры класса.
У меня нет идей как это может использоваться. Если вы знаете хороший работающий пример как используется base_init класса, пожалуйста, сообщите мне.
Функция class_init целевого типа
В структуре класса целевого типа
Здесь вы должны убедиться что инициализировали или отменили методы класса (то есть, указатели функций связанные с каждым методом класса) и создать сигналы и свойства связанные с вашим объектом.
Интерфейсная функция base_init
В интерфейсной vtable
интерфейсная функция interface_init
В интерфейсной vtable
Метод конструктора класса целевого типа: GObjectClass->constructor
В экземпляре объекта
Если вам нужно завершить инициализацию объекта после того как все свойства конструкции установлены, отмените метод конструктора и проверьте цепочку объектного родительского класса перед выполнением вашей собственной инициализации. Если сомневаетесь, не переписывайте метод конструктора.
типовая функция instance_init
В дереве иерархии классов из базового типа в целевой тип. instance_init обеспечивается для каждого типа вызывая для каждого экземпляра сструктуры.
Обеспечьте функцию instance_init для инициализации вашего объекта перед установкой конструкционных свойств. Это предпочтительный способ инициализации экземпляра GObject. Эта функция эквивалентна конструкторам C++.
Как только получила ссылку на инициализированную структуру класса, она вызывает свой метод конструктора для создания экземпляра нового объекта. Затем она просто отменяет maman_bar_class_init
в maman_bar_constructor
, вызывая её позже, потому что была реализована правильно, она связывается со своим родительским конструктором. Проблема заключается в поиске родительского конструктора. Метод (используемый в исходном коде GTK+) состоит в том, чтобы сохранить оригинальный конструктор в статической переменной в maman_bar_class_init
и зтем многократно использовать её из maman_bar_constructor
. Это вполне возможно и очень просто, но это не очень хороший метод, предпочтительней использовать функции и .
Наконец, попорядку, g_object_constructor
вызывается последней в цепочке. Эта функция распределяет инстанциированный объектный буфер через это значит в этой точке вызывается функция instance_init если она зарегистрирована. После выполнения instance_init, объект полностью инициализирован и должен быть готов ответить на любой пользовательский запрос. Когда выполнена, g_object_constructor
устанавливает свойства конструкции (то есть: свойства полученные в ) и возвращается в пользовательский конструктор которому позволяет выполнить подходящую инициализацию экземпляра...
Процессс описанный выше может показаться немного сложным (он действительно усложнён по моему..) но он может быть резюмирован таблицей ниже, которая описывает и порядок её вызова.
Таблица 4.
Первый вызов для целевого типа
Каждый вызов для целевого типа
Читатели могут быть смущены некоторым обстоятельством в порядке вызова функций: в то время как, технически, метод классового конструктора вызывается перед GType функцией instance_init (так как которая вызывает instance_init вызывается g_object_constructor
которая находится на верхнем уровне классового метода конструктора и к которому привязываются пользователи), пользовательский код который выполняется в обеспеченном пользователем конструкторе будет всегда выполняться после GType функции instance_init, так как конструктор обеспеченный пользователем должен (вы были предкпреждены) привязываться перед выполнением чего-либо полезного.