GLIB和GTK中使用C的语法模拟CPP的行为,其重载父类是怎么实现的呢?
例如,“子类”中对dispose event 的响应函数中可以轻松moko_finger_scroll_parent_class的dispose event的响应函数。
static void
moko_finger_scroll_dispose (GObject * object)
{
MokoFingerScrollPrivate *priv = FINGER_SCROLL_PRIVATE (object);
if (priv->idle_id) {
g_source_remove (priv->idle_id);
priv->idle_id = 0;
}
if (G_OBJECT_CLASS (moko_finger_scroll_parent_class)->dispose)
G_OBJECT_CLASS (moko_finger_scroll_parent_class)->
dispose (object);
}
但是,moko_finger_scroll_parent_class却是代码中没有定义过得。该变量从何来呢?
在代码中找到了宏:
G_DEFINE_TYPE (MokoFingerScroll, moko_finger_scroll, GTK_TYPE_EVENT_BOX)
仔细查找,G_DEFINE_TYPE在 GLIB 的gobject/gtype.h 中定义:
#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})
#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()
#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \
\
static void type_name##_init (TypeName *self); \
static void type_name##_class_init (TypeName##Class *klass); \
static gpointer type_name##_parent_class = NULL; \
static void type_name##_class_intern_init (gpointer klass) \
{ \
type_name##_parent_class = g_type_class_peek_parent (klass); \
type_name##_class_init ((TypeName##Class*) klass); \
} \
\
GType \
type_name##_get_type (void) \
{ \
static volatile gsize g_define_type_id__volatile = 0; \
if (g_once_init_enter (&g_define_type_id__volatile)) \
{ \
GType g_define_type_id = \
g_type_register_static_simple (TYPE_PARENT, \
g_intern_static_string (#TypeName), \
sizeof (TypeName##Class), \
(GClassInitFunc) type_name##_class_intern_init, \
sizeof (TypeName), \
(GInstanceInitFunc) type_name##_init, \
(GTypeFlags) flags); \
{ /* custom code follows */
#define _G_DEFINE_TYPE_EXTENDED_END() \
/* following custom code */ \
} \
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \
} \
return g_define_type_id__volatile; \
} /* closes type_name##_get_type() */
分享到:
相关推荐
虽然 C 语言本身不支持面向对象编程,但 GLib 的 GObject 系统通过提供类、实例、继承、虚函数等特性,弥补了这一不足。GObject 可用于创建复杂的组件和插件架构。 **文件和路径操作** GLib 提供了 GFile 和 Gio 库...
1. **对象导向编程**:GTK+基于C语言的面向对象模型,理解类、对象、继承和多态的概念是必要的。 2. **GLib数据结构**:如链表、哈希表、队列和树,它们是构建复杂程序的基础。 3. **事件驱动编程**:GTK+使用...
GObject是GLib库的一部分,提供了一种面向对象编程的机制。GObject系统支持类型系统、对象继承、信号和属性。例如,`GObject`是所有GTK+和WebKitGTK+对象的基类,`g_object_new`用于创建对象实例,`g_signal_connect...
5. **对象系统**:GLib的对象系统允许开发者使用面向对象的编程方式,包括类、实例、继承和虚函数等特性,即使在C语言中也能实现面向对象的设计。 6. **事件循环**:GLib的GMainLoop和GMainContext提供了事件驱动...
8. **GObject**:GObject是GLib的一部分,提供了面向对象编程的支持,包括类、对象、继承和接口。 9. **布局管理器**:GTK+有多种布局管理器,如格子布局(GtkGrid)、盒式布局(GtkBox)和堆栈布局(GtkStack),...
9. **类型系统**:GLib的GType系统是GObject的基础,它支持动态类型、接口、类继承等面向对象特性,使C语言也能实现面向对象编程。 10. **GObject系统**:GObject是GLib的核心,它定义了一种面向对象的模型,包括...
另外,GTK+还包括GObject系统,这是用于实现面向对象编程的基础,使得GTK可以轻松支持继承、接口和类型系统。 总的来说,这个"gtk.rar_gtk_gtk 源码"包对于想要在Linux环境下进行GUI开发的程序员来说,是一个很好的...
10. GObject系统:GObject是GLib的一部分,它为C语言提供了面向对象编程的支持,包括类、对象、继承、接口、信号和属性等概念。 通过使用GLib,开发者可以在C语言环境中享受到更高级别的抽象和便利性,同时保持代码...
在介绍中还提到了GObject,这是GLib中的一个核心组件,它为GLib中的其他组件提供了面向对象的编程接口。GObject本身不是一种数据结构,而是一个实现类和继承的对象系统框架。GObject与C++或Java中的类不同,它通过...
GTK是一个面向对象的应用程序编程接口(API),尽管它是用C语言编写的,但通过类和回调函数的概念实现了面向对象的编程思想。此外,GTK还依赖于一个名为glib的库,该库包含了标准X函数的一些替代实现,以及处理链表...
通过GObject接口,开发者可以定义和实现自定义的类型,支持继承、多态等面向对象特性。 5. **错误处理**:glib提供了GError机制,用于处理运行时错误。这种机制比简单的返回错误代码更易于理解和调试,因为它可以...
GObject是Glib中的一个面向对象的系统,提供了封装、继承、多态等面向对象的基本特性。通过GObject,GTK+能够与各种编程语言进行交互。 三、GTK+编程语言支持 正如前文所述,GTK+不仅限于C语言,它还能够与其他高级...
- **面向对象设计**:GTK+ 遵循面向对象的设计原则,即使是在C语言中也实现了面向对象编程的特性。 #### 二、GTK+ 的基本概念 - **Widgets**:GTK+ 中的所有GUI元素都是由一个或多个“widgets”组成的。每个widget...
- **GObject系统**:这是一个面向对象的系统,允许在C语言中实现面向对象的编程。GObject提供类和对象的概念,支持继承、接口、信号和属性。 - **GMainLoop和GMainContext**:这是GLib的事件处理机制,用于处理...
GObject 是GTK+ 中的一个核心概念,它是面向对象编程在GTK+ 中的实现基础。GObject 提供了一套完整且灵活的对象系统,包括类与对象的概念、继承机制、属性和信号系统。通过GObject,开发者可以创建自定义的可复用...
GTK+ 及相关的库时按照面向对象设计思想来实现的,至于这时如何实现的现在并不重要,不同的编程语言有不同的实现方法,重要的是要知道 GTK+ 使用面向对象编程技术即可。 二、GTK+ 的 GUI 元素 每一个 GTK+ 的 GUI ...
2. **GObject基础**:GObject是GLib提供的面向对象编程模型,它是所有其他GNOME库的对象的基础。GObject提供了类、实例、继承、虚方法、信号和属性等特性。 3. **内存管理**:GLib提供了一套完整的内存管理机制,...
GObject则是GLib的对象模型,提供了一种面向对象编程的方式,支持类、继承、接口和属性等概念。 总之,`glib-html-2.12.13.tar.gz`压缩包中的文档对于理解GLib及其在GTK程序开发中的应用至关重要。开发者可以通过这...
GObject库则提供了面向对象编程的支持,使得在C语言中也能方便地实现继承、封装和多态。 GStreamer允许开发者轻松地处理音频和视频流,这对于开发媒体应用非常有用。通过添加不同的插件,可以实现播放、录制、转换...
2. C++基础:回顾面向对象编程的概念,如类、对象、继承、多态。 3. Gtk+入门:安装Gtk+,理解基本的窗口和控件使用方法。 4. GObject和信号系统:学习GObject模型,理解如何使用信号和槽进行事件处理。 5. 控件和...