Справочное описание GObject |
---|
Есть множество пользовательских соглашений которые необходимо соблюдать при создании новых типов экспортируемых в заголовочные файлы:
Используйте шаблон object_method
для имён функций:
для вызова метода с именем foo в экземпляре типового объекта bar, назовите его
bar_foo
.
Используйте префикс для избежания конфликтов пространства имён с другими проектами.
Если ваша библиотека (или приложение) имеет имя Maman,
[3]
префикс всех имён ваших функций должен быть maman_.
Например: maman_object_method
.
Создайте макрос с именем PREFIX_OBJECT_TYPE
который всегда
возвращает GType для связанного с ним типового объекта. Для объекта типа
Bar в библиотеке с префиксом maman,
используйте: MAMAN_BAR_TYPE
.
Обычно это так, хотя нет соглашения для реализации этого макроса используя либо глобальную статическую переменную
либо функцию с именем prefix_object_get_type
.
Мы будем следовать функциональному шаблону везде где это возможно в этом документе.
Создайте макрос с именем PREFIX_OBJECT (obj)
который возвращает
указатель типа PrefixObject. Этот макрос используется для обеспечения
статической безопасности типа выполняя приведение везде где это необходимо. Он так же обеспечивает
динамическую безопасность типа выполняя проверку во время выполнения. Возможно отключение динамического
контроля типа при выполнении сборки
(смотрите сборка glib).
Например, мы должны создать MAMAN_BAR (obj)
относительно предыдущего примера.
Если тип классифицирован, создайте макрос с именем
PREFIX_OBJECT_CLASS (klass)
. Этот макрос
строго эквивалентен предыдущему макросу приведения типов: он выполняет статическое приведение типа
с динамической проверкой соответствия структурного класса. Он, как ожидается, возвращает указатель
на типовую структуру класса PrefixObjectClass. Снова, пример:
MAMAN_BAR_CLASS
.
Создайте макрос с именем PREFIX_IS_BAR (obj)
: этот макрос должен возвращать
gboolean которая указывает соответствует ввод типу объекта BAR или нет.
Если тип классифицирован, создайте макрос с именем
PREFIX_IS_OBJECT_CLASS (klass)
, который, как и предыдущий, возвращает логическое
если введенный указатель класса соответствует классу типа OBJECT.
Если тип классифицирован, создайте макрос с именем
PREFIX_OBJECT_GET_CLASS (obj)
который возвращает указатель класса связанный с экземпляром полученного типа. Этот макрос используется
для обеспечения статической и динамической безопасности типа (также как предыдущие макросы приведения).
Реализация этих макросов является достаточно прямоленейной: большинство простых в использовании
макросов обеспечивает gtype.h
. Например использованные нами выше,
мы можем записать следующим простым кодом объявляющим макросы:
#define MAMAN_BAR_TYPE (maman_bar_get_type ())
#define MAMAN_BAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_BAR_TYPE, MamanBar))
#define MAMAN_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_BAR_TYPE, MamanBarClass))
#define MAMAN_IS_BAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_BAR_TYPE))
#define MAMAN_IS_BAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_BAR_TYPE))
#define MAMAN_BAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_BAR_TYPE, MamanBarClass))
Придерживайтесь имени klass
, поскольку class
зарегистрированное ключевое слово С++.
Следующий код демонстрирует как реализовать функцию maman_bar_get_type
:
GType maman_bar_get_type (void)
{
static GType type = 0;
if (type == 0) {
static const GTypeInfo info = {
/* You fill this structure. */
};
type = g_type_register_static (G_TYPE_OBJECT,
"MamanBarType",
&info, 0);
}
return type;
}