C Program GObject简介

介绍

因为C语言并不是为面向对象程序设计而生,它没有明确的支持类,继承,多态和其他面向对象概念。它同样没有自己的虚表,虚表多见于C++/Java/C#面向对象语言。因此使用C语言特性和标准库来实现面向对象的编程范例可能不那么容易。然而,可以使用包含函数指针和数据的结构体,或者通过使用第三方库来完成。有许多第三方库被设计来支持C语言实现面向对象程序。其中最通用和广泛使用的是GObject系统,它是Glib的一部分。GObject系统有自己的虚表。使用GObject系统来创建C语言实现的对象,它必须从GObject结构体进行子类化。

声明类

(两个结构体需要被声明,instance对象成员 和 class类成员)

/*in myobject.h*/
typedef struct _MyObject MyObject;
typedef struct _MyObjectClass MyObjectClass;

struct _MyObject
{
  GObject parent_instance;

  /* instance members */
};

struct _MyObjectClass
{
  GObjectClass parent_class;

  /* class members */
};
样板代码

因为GObject系统仅仅是第三方库,因此不能对C语言本身做什么修改,所以创建新的对象(类)需要大量的模版代码。

样板代码如下:

/* in myobject.h */
#define MY_TYPE_OBJECT                   (my_object_get_type ())
#define MY_OBJECT(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_OBJECT, MyObject))
#define MY_IS_OBJECT(obj)                (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_OBJECT))
#define MY_OBJECT_CLASS(_class)          (G_TYPE_CHECK_CLASS_CAST ((_class), MY_TYPE_OBJECT, MyObjectClass))
#define MY_IS_OBJECT_CLASS(_class)       (G_TYPE_CHECK_CLASS_TYPE ((_class), MY_TYPE_OBJECT))
#define MY_OBJECT_GET_CLASS(obj)         (G_TYPE_INSTANCE_GET_CLASS ((obj), MY_TYPE_OBJECT, MyObjectClass))
定义类

使用之前,新创建的类需要被定义。

/* in myobject.c */
G_DEFINE_TYPE(MyObject, my_object, G_TYPE_OBJECT);
静态方法

有一些静态方法可定义,可不定义。主要依据于设计的类,对于最小的类以下的函数是必须的:

/* in myobject.c */
static void my_object_class_init(MyObjectClass *_class)
{
     /* code */
}

static void my_object_init(MyObject* obj)
{
     /* code */
}
构造函数

对于C语言实现的对象没有内部的方法分配内存,因此对于新类需要明确的构造函数。

/* in myobject.c */

GObject* my_object_new(void)
{
     return g_object_new(MY_TYPE_OBJECT , 0);
}
类的使用

虽然在创建对象时,使用自己指针类型是很对的,但是推荐使用继承关系顶层的对象的指针类型,即最远的基类。新创建的类可以被如下使用:

/* in main.c */

/* Note: GObject is at the top of the hierarchy. */

/* declaration and construction */
GObject* myobj = my_object_new();

/* destruction */
g_object_unref(myobj);   //析构函数?
继承实现

在GObject系统,继承可以通过子类化GObject实现。因为C语言不提供与继承相关的关键字和操作符,通过分别在继承instance和继承class结构体中声明基instance和基class为成员,来实现继承。C代码如下:

/* derived object instance */
struct DerivedObject
{
     /* the base instance is a member of the derived instance */
     BaseObject parent_instance;
};

/* derived object class */
struct DerivedObjectClass
{
    /* the base class is a member of the derived class */
    BaseObjectClass parent_class;
};

参考:

https://en.wikibooks.org/wiki/C_Programming/GObject https://www.cs.rit.edu/~ats/books/ooc.pdf