林信良(良葛格)的专栏

http://caterpillar.onlyfun.net/

用户操作
[即时聊天] [发私信] [加为好友]
良葛格ID:caterpillar_here
226196次访问,排名290好友0人,关注者67
caterpillar_here的文章
原创 49 篇
翻译 0 篇
转载 1 篇
评论 325 篇
良葛格的公告
更多文件请访问
良葛格学习笔记

最近评论
hq_love_love:林老师问您一个问题。我在运行的这第一个例子加载下拉列表的值的时候会有一个alert(list);可以弹出后台String[]所返回的值。而在用DWRUtil.addOptions("op",list);时确报了个错,错误如下
[Object error]...
wangliang_hust2:不错!
wangliang_hust2:顶!!!
jbaowei2000:找不到JSONObject ,报异常
jbaowei2000:JSONObject 是什么?没看明白
文章分类
收藏
    相册
    Java
    夏昕的专栏
    良葛格学习笔记
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 GTK 的物件導向架構收藏

    新一篇: GTK 入門文件 | 旧一篇: Ubuntu 下的哈囉!GTK+!

    GTK 基本上是使用 C 語言來撰寫,即使C語言本身不支援物件導向,但GTK在架構上運用了一些方式,使得使用GTK時可以支援許多物件導向的概念。

    在物件導向的封裝特性上,GTK以結構(structure)的方式來模擬類別,事實上GTK也直接稱這些結構為類別,以建構GtkWindow的程式碼為例:
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    在函式的組織上,與GtkWindow相關的函式,都是以gtk_window名稱作為開頭,gtk_window_new()就像是物件導向程式語言中的建構式,如果要設置GtkWindow的相關屬性,例如標題名稱:
    gtk_window_set_title(GTK_WINDOW(window), "哈囉!GTK+!");

    gtk_window_set_title()的第一個參數接受GtkWindow指標,透過這種方式,讓實際上屬於全域的函 式,看來就像是專屬於GtkWindow所使用,就如同物件上所帶有的公開(public)方法(method)或成員函式(member function),而在私有(private)的模擬上,GTK使用static函式,例如在gtkwindow.c原始程式碼中,可以看到:
    static void gtk_window_dispose            (GObject           *object);
    static void gtk_window_destroy            (GtkObject         *object);
    static void gtk_window_finalize           (GObject           *object);
    static void gtk_window_show               (GtkWidget         *widget);
    static void gtk_window_hide               (GtkWidget         *widget);
    static void gtk_window_map                (GtkWidget         *widget);
    static void gtk_window_unmap              (GtkWidget         *widget);
    static void gtk_window_realize            (GtkWidget         *widget);
    static void gtk_window_unrealize          (GtkWidget         *widget);

    這些static函式不會出現在gtkwindow.h標頭文件中,僅可在gtkwindow.c中使用,這看起來就像是GtkWindow的專屬私用函式。

    在繼承上,GTK實際上使用結構鏈接(link)的方式,在
    第一個 GTK 程式 中看過以下的繼承關係:
    GObject
     +--GInitiallyUnowned
         +-- GtkObject
               +-- GtkWidget
                     +-- GtkContainer
                           +-- GtkBin
                                 +-- GtkWindow

    以GtkContainer為例,在gtkcontainer.h中有如下的定義:
    typedef struct _GtkContainer       GtkContainer;
    ...

    struct _GtkContainer
    {
      GtkWidget widget;
     
      GtkWidget *focus_child;
     
      guint border_width : 16;

      /*< private >*/
      guint need_resize : 1;
      guint resize_mode : 2;
      guint reallocate_redraws : 1;
      guint has_focus_chain : 1;
    };

    GtkContainer的成員中有一個GtkWidget,而再來看到gtkwidget.h:
    typedef struct _GtkWindow          GtkWindow;
    ...
    struct _GtkWidget
    {
      /* The object structure needs to be the first
       *  element in the widget structure in order for
       *  the object mechanism to work correctly. This
       *  allows a GtkWidget pointer to be cast to a
       *  GtkObject pointer.
       */
      GtkObject object;
        ...
    };


    GtkWidget中有個成員為GtkObject,以如此的鏈結關係來維持物件上的繼承關係架構,而在gtk_window_set_title()函式的使用例子中:
    gtk_window_set_title(GTK_WINDOW(window), "哈囉!GTK+!");

    GTK_WINDOW是一個巨集,用來進行指標型態轉型動作:
    #define GTK_WINDOW(obj)
              (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_WINDOW, GtkWindow))


    G_TYPE_CHECK_INSTANCE_CAST巨集定義在GLib的gtype.h(
    /usr/include/glib-2.0/gobject/gtype.h)中:
    #define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type)   
                (_G_TYPE_CIC ((instance), (g_type), c_type))


    G_TYPE_CHECK_INSTANCE_CAST巨集會檢查instance是否為g_type的一個實例,如果不是的話就發出警示訊息,若是的話就將指標轉型為c_type型態(參考 G_TYPE_CHECK_INSTANCE_CAST 線上文件說明)。

    即便在熟悉C++、Java等支援物件導向程式語言的人來說,這樣的架構在物件導向的概念上並不完整,但確實在易讀與維護性上加強了不少。

    发表于 @ 2008年06月05日 15:32:00|评论(loading...)|

    新一篇: GTK 入門文件 | 旧一篇: Ubuntu 下的哈囉!GTK+!

    评论

    #shendl 发表于2008-06-09 11:10:35  IP: 58.39.186.*
    用C模拟对象,那为什么不直接使用C++呢?C本来就没有设计基于对象或面向对象开发的能力。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 良葛格