如何创建一个可以从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。然后,该类将使用环境中的信息进行适当的响应,并获得新的延续,因此循环可以重新开始,以便下一条消息。
答案 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
附加您自己的信息并使用现有信号来连接您的续点似乎更容易。