Можно ли расширить GKeyFile, чтобы он содержал частное поле перечисления ·origin· через GType?

Я ищу хорошее решение для следующей проблемы:

  • имея некоторые ключи, хранящиеся в структуре GKeyFile, я поместил их туда из 3 разных источников: 1) скомпилировано в данных, 2) другой ini-файл, 3) скрипт плагина,
  • Я хочу пометить каждую пару ключ/значение источником, из которого она пришла.

Я наткнулся на GType и примеры добавления частного элемента данных к существующему типу во время выполнения. Примеры очень прямые (ссылка). Поэтому я подумал о добавлении такого частного поля (перечисление origin) где-нибудь в GType GKeyFile, в основном к (другому GType?) типу значения в каждой из сохраненных пар ключ/значение, но я не знаю, как это должно быть сделано.

Существует G_TYPE_KEY_FILE макрос, который возвращает GType из GKeyFile. Однако с чего начать?


person psprint    schedule 31.12.2020    source источник


Ответы (1)


Вы не можете добавить частную структуру к типу, если вы не контролируете реализацию типа. Вы не контролируете реализацию GKeyFile (это внутреннее свойство GLib), поэтому вы не можете этого сделать.

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

person Philip Withnall    schedule 31.12.2020
comment
Жаль… Контроль над реализацией — это слишком серьезный подход IMO — я не вижу несколько неуклюжей (или просто медленной…) команды программистов GLib, чтобы изменить реализацию существенно. Если бы я мог использовать интроспекцию GObject, то, может быть, я смог бы узнать, как строится тип, и в конце концов расширить его? - person psprint; 31.12.2020
comment
Член команды программистов GLib пытается вам помочь, а вы называете их неуклюжей, хорошей работой... Такая инкапсуляция широко используется и обычно считается хорошей идеей, особенно для библиотек. Вы не сможете использовать для этого интроспекцию GObject, потому что она не даст вам больше информации, чем вы уже могли бы получить из заголовочного файла GLib. Обратите внимание, что для GObjects запрашиваемая вами возможность предоставляется g_object_set_data(), но GKeyFile не является GObject. - person ptomato; 31.12.2020