GObject

GObject是GLib的可移植对象系统,作为GNOME的基石,被广泛应用于GTK+等。GObject提供了动态类型系统,包括基础类型、派生类型、消息系统(Closures和Signals)等。它允许在C语言中直接使用,也可用于其他语言的绑定。GObject的类结构体和实例结构体分别对应类和实例的实现,其中实例结构体以父类结构体开始,确保对象以指向类结构的指针开头。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GObject

GLib Object System,也叫GObject,是一个免费的库(由LGPL授权)。它提供了一个可移植的对象系统,清晰的跨语言互用性。GObject被设计成既可以直接在C语言中使用,也可以通过绑定,用于其它语言。

历史

GObject只依赖于GLib和libc,它是GNOME的基石,被广泛应用于GTK+,Pango,Accessibility Toolkit及大多数高层次GNOME库和应用程序。在GTK+2.0 之前,GObject代码是GTK+代码的一部分。(名字“GObject ” 当时还未使用——共同的基类叫GtkObject)

 

由于它的通用性,GTK+2.0把这个对象系统给抽取成一个分离的库。 再这个过程中,GtkObject内和GUI无关的部分被移到GObject中,GObject成为新的共同基类。自从2002年3月11日(GTK+2.0发布),GObject作为一个分离开的库已经被很多非GUI的程序所使用,例如命令行和server应用程序。

和Gilb的关系

尽管GObject有它自己的文档集,并且通常被编译成它自己的共享文件,但是GObject的源代码位于GLib的源代码树,并且和GLib一起发布。因此,GObject采用GLib的版本号,典型地和Glib打包在一起(例如,Debian把GObject放在libglib2.0包族)。

类型系统

GObject框架最基础的一层是一个叫做GType的泛化的动态的类型系统。GType系统保存着所有对象的运行时描述符,这样可以利用“胶水”代码便于多语言绑定。这个类型系统可以处理任何单继承类结构,附加地也可以处理

### GObject 的继承机制及其示例 GObject 提供了一种基于 C 语言的对象系统,允许开发者创建可扩展的类层次结构。其继承机制类似于面向对象编程中的概念,但在底层依赖于宏和函数调用来实现。 #### 定义父类与子类 为了实现继承,通常需要定义一个基类并在此基础上派生新的子类。下面是一个简单的例子: ```c // 声明头文件 kb-article.h 中的内容 #ifndef KB_ARTICLE_H #define KB_ARTICLE_H #include <glib-object.h> #define TYPE_KB_ARTICLE (kb_article_get_type ()) #define KB_ARTICLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_KB_ARTICLE, KbArticle)) #define KB_IS_ARTICLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_KB_ARTICLE)) typedef struct _KbArticle KbArticle; typedef struct _KbArticleClass KbArticleClass; struct _KbArticle { GObject parent_instance; // 父类实例 }; struct _KbArticleClass { GObjectClass parent_class; // 父类指针 }; GType kb_article_get_type (void); #endif /* KB_ARTICLE_H */ ``` 上述代码展示了如何声明一个新的 `KbArticle` 类型,并将其作为 `GObject` 的子类[^2]。 --- #### 初始化类和实例 在实现部分,需完成类型的注册以及初始化逻辑: ```c #include "kb-article.h" static void kb_article_init(KbArticle *self); static void kb_article_class_init(KbArticleClass *klass); G_DEFINE_TYPE(KbArticle, kb_article, G_TYPE_OBJECT) static void kb_article_init(KbArticle *self) { // 实例初始化代码 } static void kb_article_class_init(KbArticleClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); object_class->finalize = NULL; // 可选:自定义析构函数 object_class->dispose = NULL; // 可选:资源释放函数 } ``` 这里的关键在于使用 `G_DEFINE_TYPE` 宏简化了类型注册的过程,并分别提供了用于初始化类 (`class_init`) 和实例 (`init`) 的回调函数[^4]。 --- #### 属性支持 除了基本的继承外,GObject 还提供了一个强大的属性系统,可以通过 `set_property` 和 `get_property` 函数动态管理对象的状态。以下是设置属性的例子: ```c enum { PROP_0, PROP_TITLE, N_PROPERTIES }; static GParamSpec *properties[N_PROPERTIES]; static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { KbArticle *self = KB_ARTICLE(object); switch(prop_id){ case PROP_TITLE: g_free(self->title); // 避免内存泄漏 self->title = g_value_dup_string(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { KbArticle *self = KB_ARTICLE(object); switch(prop_id){ case PROP_TITLE: g_value_set_string(value, self->title); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); break; } } static void kb_article_class_init(KbArticleClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); properties[PROP_TITLE] = g_param_spec_string("title", "Title", "The title of the article", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties(object_class, N_PROPERTIES, properties); object_class->set_property = set_property; object_class->get_property = get_property; } ``` 此段代码实现了对 `title` 属性的支持,使得外部可以方便地读取或修改该值[^3]。 --- #### 构造与销毁 当对象被创建时会自动调用构造器;而当不再需要它时,则按照继承链依次执行各层的析构方法。这种行为与 C++ 十分相似。 ```c int main(int argc, char **argv) { g_type_init(); // 初始化类型系统 KbArticle *article = g_object_new(TYPE_KB_ARTICLE, "title", "Sample Title", NULL); gchar *title = g_strdup(g_object_get_data(G_OBJECT(article), "title")); printf("Article Title: %s\n", title ? title : "(null)"); g_free(title); g_object_unref(article); // 手动减少引用计数直至销毁 return 0; } ``` 以上程序片段演示了如何利用 `g_object_new()` 创建新对象,并通过参数传递方式指定初始状态。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值