2

どのようなタイプの GTK+ 2.0 ウィジェットからも継承できるクラスを C で作成するにはどうすればよいですか? C++ を使用する場合は、そのパラメーターから継承して必要な動作を追加するテンプレートがあり、Objective-C で同様のことを行う場合は、NSProxy を使用してメッセージをクラス メンバーに転送することを知っています。これは実際のビュー コントローラーですが、GTK+ 2.0 を使用して C で同じタスクを達成する方法がわかりません。

どのようなタイプの GTK+ 2.0 ウィジェットからも継承できるクラスを C で作成するにはどうすればよいですか?

PS 理由を尋ねる人もいます。理由を尋ねることは十分に公平です。以前の質問でわかるように、オブジェクト指向でない GUI ライブラリは何ですか? 私は非オブジェクト指向の方法でプログラミングすることに挑戦してきました。オブジェクト指向ではない方法でプログラミングしたいので、GTK+ 2.0 で利用可能なすべてのクラスを抽象化して、必要な動作を表現する必要があります。具体的には、各クラスを継続で機能させる必要があります。

簡単な継続の実装は次のとおりです。

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

その継続にメッセージを送信したいクラスは、IP 値が (スタブ) 関数 event_get を指すまで、その継続をその環境に適用されたその IP の結果で継続的に置き換えます。次に、クラスは環境内の情報を使用して適切に応答し、新しい継続を取得するため、次のメッセージのためにサイクルを最初からやり直すことができます。

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 に答える