1 GObject学习经历

我的GObject系统性学习可以分为两次

2 第二次学习GObject

  • 二、GObject:讲述了基本的GObject对象,分为类结构体和实例结构体。g_object_newg_object_refg_object_unref等函数创建对象,引用计数。

  • 三、类型系统和注册流程

    1. g_type_register_static 注册一个静态对象类型。(这是 G_DEFINE_TYPE 宏展开的主要函数,该宏用的是 g_type_register_static_simple 函数)。第五节 注册讲述了如何手动注册一个静态对象类型。

    2. G_DEFINE_TYPEG_DECLARE_FINAL_TYPE 宏展开内容以及作用。

  • 四、信号:讲述了如何注册信号。

  • 五、属性:讲述了如何注册属性。

  • 六、可派生和抽象类型:这个可派生是声明型宏 G_DECLARE_DERIVABLE_TYPE 声明了一下特性,告诉我们这个对象是可派生,也就是可继承的。声明型宏还有 G_DECLARE_FINAL_TYPE。定义型宏有 G_DEFINE_TYPEG_DEFINE_ABSTRACT_TYPEG_DEFINE_FINAL_TYPE

    1. 这篇文章使用了 G_DECLARE_DERIVABLE_TYPE可继承型Declare宏和G_DEFINE_ABSTRACT_TYPE抽象类Define宏,编写一个抽象类型对象 TNumber

    2. 继承TNumber,使用G_DECLARE_FINAL_TYPEG_DEFINE_TYPE编写了 TIntTDouble(其实可以使用 G_DEFINE_FINAL_TYPE )。涉及到了虚函数重写,其实就是抽象类成员函数指针。TIntTDouble 都重写了父类 TNumber 的类成员函数指针(自己编写了一个函数,把该函数的指针赋值给父类成员函数指针,由此实现了多态)。

  • 七、可派生和非抽象类型:使用 G_DECLARE_DERIVABLE_TYPEG_DEFINE_TYPE_WITH_PRIVATE宏,编写了 TStr 对象。使用该带有私有结构体定义型宏:

    1. 为了 TStr 有私有域,而且不对子类Public。

    2. TStr 可以被实例化。

  • 八、子类扩展父类的功能:使用 G_DECLARE_FINAL_TYPE (TNumStr, t_num_str, T, NUM_STR, TStr)G_DEFINE_TYPE(TNumStr, t_num_str, T_TYPE_STR) 继承上一节的 TStr对象,编写了数字字符串 TNumStr 对象。

     GObject
        ╰──TNumber # 抽象可继承类型
           ╰──TInt # 最终型对象,可以添加接口TComparable
           ╰──TDouble # 最终型对象,可以添加接口TComparable (不可继承对象)
    
     GObject
        ╰──TStr # 非抽象可继承类型,可以添加接口TComparable
           ╰──TNumStr # 最终型对象(不可继承对象)
    
  • 九、接口:接口可以被任何对象添加到实例结构体中,实现接口的虚函数,这样所有对象都可以实现多态,不一定要同一个基类。接口的声明和定义用到 G_DECLARE_INTERFACEG_DEFINE_INTERFACE 宏。子对象实现接口的时候用到 G_IMPLEMENT_INTERFACE 宏。

  • 十、十、声明和定义类型宏总结

    总结了几种 G_DFINE_XX 型宏和 G_DECLARE_XX 型宏的具体作用和区别:

    • G_DEFINE_TYPEG_DEFINE_ABSTRACT_TYPEG_DEFINE_FINAL_TYPE 主要区别就是类型注册函数flag参数的不同,抽象类型不能被实例化,只能被继承;最终型不能被继承

    • G_DECLARE_DERIVABLE_TYPEG_DECLARE_FINAL_TYPE 主要区别就是定义类和实例结构体不同

     /* G_DECLARE_DERIVABLE_TYPE (TDouble, t_double, T, DOUBLE, GObject) */
     typedef struct _TDouble TDouble; 
     typedef struct _TDoubleClass TDoubleClass; 
     struct _TDouble { GObject parent_instance; }; 
    
     /* G_DECLARE_FINAL_TYPE (TDouble, t_double, T, DOUBLE, GObject) */
     typedef struct _TDouble TDouble; 
     typedef struct { 
     GObjectClass parent_class; 
     } TDoubleClass;