2

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

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

PS有些人会问为什么。问为什么是公平的。正如我之前的问题所见,哪些 GUI 库不是面向对象的?我一直在挑战自己以非面向对象的方式进行编程。因为我想以非面向对象的方式进行编程,所以我需要对 GTK+ 2.0 中可用的所有类进行抽象,以呈现我想要的那种行为。具体来说,我需要让每个班级都继续工作。

一个简单的延续实现是:

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

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

4

2 回答 2

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;
于 2012-08-19T19:51:38.957 回答
1

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

于 2012-08-19T20:28:36.037 回答