GObject [3] 子類物件私有屬性的模擬-隱藏
阿新 • • 發佈:2019-02-07
1、隱藏什麼,為什麼要隱藏?
隱藏的就是非類型別資料,也就是不是我們要封裝成類的資料。
隱藏以後就簡化了.h檔案,.c檔案複雜了,使用類的人當然是希望他要看到的.h檔案越簡單越好。而.c這部分程式碼通常是第三方並不關注的。
2、如何隱藏?
方法很多,這裡寫出兩種。
第一種,很簡單,加上註釋 /*private*/ 和/*public*/
第二種,將上一篇的例子進行隱藏以後的結果如下:
hw-dlist.h
#ifndef HWDLIST_H #define HWDLIST_H #include <glib-object.h> #define HW_TYPE_DLIST (hw_dlist_get_type()); typedef struce _HWDList HWDlist; struct _HWDList { //例項結構體 GObject parent_instance; //這裡的GObject 是GObject的例項結構體 }; typedef struce _HWDListClass HWDListClass; //類結構體 struct _HWDListClass { GObjectClass parent_class; //這裡的GObjectClass 是GObject的類結構體 }; GType hw_dlist_get_type(void); #endif
hw-dlist.c
#include "hw-dlist.h" // 以下這個巨集相當於hw_dlist_get_type()函式, G_DEFINE_TYPE (HWDlist, hw_dlist, G_TYPE_OBJECT); //定義這個巨集來幫助我們獲取隱藏的資料 #define PM_DLIST_GET_PRIVATE(obj) ( G_TYPE_INSTANCE_GET_PRIVATE ((obj), PM_TYPE_DLIST, PMDListPrivate)) //**** // 這個撲通的機構體從.h檔案移到了.c檔案中 typedef struct _HWDlistNode HWDlistNode; struct _HEDlistNode{ HWDlistNode *prev; HWDlistNode *next; void *data; }; // 把實力結構體中的非類資料拿出來重新建立一個結構體 typedef struct _HWDlistPrivate HWDlistPrivate; struct _HWDlistPrivate{ HWDlistNode *tail; HWDlistNode *head; }; static void hw_dlist_init(HWDlist *self){ // 這一行 HWDlistPrivate *priv = HW_DLIST_GET_PRIVATE(self); //*** g_printf("例項結構體初始化\n"); self -> head = NULL; self -> tail = NULL; } static void hw_dlist_class_init(HWDlistClass *class){ // HWDlistPrivate 結構體新增到HWDlist物件中 g_type_class_add_private(class, sizeof(HWDlistPrivate)); //*** g_printf("類結構體初始化\n"); }
兩個概念:
類和物件的方法:在.h檔案中宣告,在型別註冊檔案.c中具體定義
- 物件屬性:表示屬於例項結構體的屬性,文件中講了怎麼隱藏
- 類屬性:表示屬於類結構體的屬性,可以被所有的物件共享,文件中講了怎麼通過類屬性來訪問物件屬性。