GLIB、GTK中的“面向对象的继承”

xiaoxiao2024-04-14  25

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() */  
转载请注明原文地址: https://www.6miu.com/read-5014971.html

最新回复(0)