如何创建一个可以继承C中任何类型的GTK + 2.0小部件的类?

时间:2012-08-19 18:32:20

标签: c gtk gobject

如何创建一个可以从C中继承任何类型的GTK + 2.0小部件的类?我知道如果我使用C ++我会有一个模板继承它的参数并添加我需要的行为,如果我要用Objective-C做类似的事情,我可能会使用NSProxy并将消息转发给类成员这是真正的视图控制器,但我不知道如何使用GTK + 2.0在C中完成相同的任务。

如何创建一个可以从C中继承任何类型的GTK + 2.0小部件的类?

P.S。有些人会问为什么。问为什么是公平的。正如您在上一个问题What GUI libraries are not object-oriented?中所看到的,我一直在挑战自己以非面向对象的方式编程。因为我想以非面向对象的方式编程,所以我需要对GTK + 2.0中可用的所有类进行抽象,以呈现我想要的行为。具体来说,我需要让每个班级都使用延续。

一个简单的延续实现是:

struct CONTINUATION;
typedef struct CONTINUATION continuation;
struct CONTINUATION {
     void* environment;
     continuation (*ip)(void*); 
};

一个想要向其发送消息的类将继续替换它的延续,其结果是ip应用于它的环境,直到ip值指向(存根)函数event_get。然后,该类将使用环境中的信息进行适当的响应,并获得新的延续,因此循环可以重新开始,以便下一条消息。

2 个答案:

答案 0 :(得分:1)

一旦您决定使用C执行此操作,您仍然拥有的唯一选项是宏,例如:

#define GtkStruct(x) \
struct x {   \
   int   base_class_field1;  \
   char *base_class_field2;

#define GtkStruct(x, base_type) \
struct x {   \
   base_type base_class_data;

答案 1 :(得分:1)

这很容易;只要您想从类型继承,请使用g_type_register_dynamic并提供父类型。我不清楚你为什么要继承现有类型的子类;在大多数情况下,使用g_object_set_qdata_full附加您自己的信息并使用现有信号来连接您的续点似乎更容易。