GLib
  • Initial page
  • I. Концепция
    • Background
    • Типы данных и программирование
  • Динамическая система типов Glib
    • Введение
    • Функции копирования
    • Соглашения
    • Неинстанциируемые не классифицированные базовые типы
    • Инстанциируемые классифицируемые типы: объекты
    • Неинстанциированные классифицированные типы: Интерфейсы.
  • Основной класс GObject
    • Введение
    • Инстанциация объекта
    • Объектное управление памятью
    • Свойства объекта
  • Система сообщений GObject
    • Замыкания
    • Сигналы
  • II. Описание API
    • GType
    • GTypePlugin
    • GTypeModule
    • GObject часть 1
    • GObject часть 2
    • Enums and Flags
    • GBoxed
    • Generic Values
    • Parameters and Values часть 1
    • Parameters and Values часть 2
    • Parameters and Values часть 3, ага
    • Value arrays
  • III. Описание инструментов
    • glib-mkenums
    • glib-genmarshal
    • gobject-query
  • IV. Руководство
    • Как определить и реализовать новый GObject?
    • Объектные методы
    • Как определять и реализовывать Интерфейсы?
    • Как создавать и использовать сигналы
    • Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)
  • V. Об инструментах
    • Об инструментах
  • GTK 4
    • GtkApplication и GtkApplicationWindow
    • Widgets
Powered by GitBook
On this page

Was this helpful?

  1. Динамическая система типов Glib

Соглашения

PreviousФункции копированияNextНеинстанциируемые не классифицированные базовые типы

Last updated 6 years ago

Was this helpful?

Есть множество пользовательских соглашений которые необходимо соблюдать при создании новых типов экспортируемых в заголовочные файлы:

  • Используйте шаблон object_method для имён функций: для вызова метода с именем foo в экземпляре типового объекта bar, назовите его bar_foo.

  • Используйте префикс для избежания конфликтов пространства имён с другими проектами. Если ваша библиотека (или приложение) имеет имя Maman, [] префикс всех имён ваших функций должен быть maman_. Например: maman_object_method.

  • Создайте макрос с именем PREFIX_OBJECT_TYPE который всегда возвращает GType для связанного с ним типового объекта. Для объекта типа Bar в библиотеке с префиксом maman, используйте: MAMAN_BAR_TYPE. Обычно это так, хотя нет соглашения для реализации этого макроса используя либо глобальную статическую переменную либо функцию с именем prefix_object_get_type. Мы будем следовать функциональному шаблону везде где это возможно в этом документе.

  • Создайте макрос с именем PREFIX_OBJECT (obj) который возвращает указатель типа PrefixObject. Этот макрос используется для обеспечения статической безопасности типа выполняя приведение везде где это необходимо. Он так же обеспечивает динамическую безопасность типа выполняя проверку во время выполнения. Возможно отключение динамического контроля типа при выполнении сборки (смотрите ). Например, мы должны создать 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;
}
3
сборка glib