GObject 子類物件的私有屬性模擬
轉載自 http://garfileo.is-programmer.com/2011/2/28/data-hiden.24848.html
上一篇文章“使用 GObject 庫模擬類的資料封裝形式”講述了 GObject 子類化過程,本文以其為基礎,進一步講述如何對資料進行隱藏,即對面向物件程式設計中的“私有屬性”概念進行模擬。
非類型別資料的隱藏
第一個問題,可以稱之為非類型別資料結構的隱藏,因為 PMDListNode 是普通的 C 結構體。隱藏這個結構體成員的方法有多種。
第一種方法尤為簡單,如下:
?1 2 3 4 5 6 7 8 |
typedef
struct
_PMDListNode PMDListNode;
struct
_PMDListNode {
/* private */
PMDListNode *prev;
PMDListNode *next;
/* public */
void
*data;
};
|
只需要向結構體中新增一條註釋,用於標明哪些成員是私有的,哪些是可以被直接訪問的。
也許你會認為這是開玩笑呢吧!但,這是最符合 C 語言設計理念的做法。C 語言認為,程式設計師應當知道自己正在幹什麼,而且保證自己的所作所為是正確的。
倘若你真的這麼認為這是在開玩笑,那也沒什麼。我們還可以使用第二種隱藏的方法,即在 pm-dlist.h 檔案中保留下面程式碼:
?1 |
typedef
struct
_PMDListNode PMDListNode;
|
並將以下程式碼:
?1 2 3 4 5 |
struct
_PMDListNode {
PMDListNode *prev;
PMDListNode *next;
void
*data;
};
|
轉移到 pm-dlist.c 檔案中。
這下隱藏的非常徹底。當然,這並不能防止使用者開啟 pm-dlist.c 檔案檢視 PMDListNode 的定義。不過,我們是自由軟體,不怕你看。
如果想半遮半掩,稍微麻煩一些。可以在 pm-dlist.h 中寫入以下程式碼:
?1 2 3 4 5 6 |
typedef
struct
_PMDListPriv PMDListPriv;
typedef
struct
_PMDListNode PmdListNode;
struct
_PMDListNode {
PMDListPriv priv;
void
*data;
};
|
然後,將 PMDListPriv 的定義放在 pm-dlist.c 檔案中,如下:
?1 2 3 4 |
struct
_PMDListPriv {
PMDListNode *prev;
PMDListNode *next;
};
|
GObject 子類物件的屬性隱藏
GObject 子類物件的屬性即繼承 GObject 類的類的例項結構體所包含的屬性,這句話說起來還真拗口。
考慮一下如何隱藏 PMDList 類的例項結構體中的成員。先回憶一下這個結構體的定義:
?1 2 3 4 5 6 |
typedef
struct
_PMDList PMDList;
struct
_PMDList {
GObject parent_instance;
PMDListNode *head;
PMDListNode *tail;
};
|
我們希望 head 與 tail 指標不容他人窺視,雖然可以使用上一節的方式進行資料隱藏,但是 GObject 庫為 GObject 子類提供了一種私有結構體的機制,基於它也可以實現資料隱藏,而且更像是隱藏。
首先,我們將 pm-dlist.h 中 PMDList 結構體的定義修改為:
?1 2 3 4 |
typedef
|