1. 程式人生 > >GObject 子類物件的私有屬性模擬

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

相關推薦

GObject [3] 物件私有屬性模擬-隱藏

1、隱藏什麼,為什麼要隱藏? 隱藏的就是非類型別資料,也就是不是我們要封裝成類的資料。 隱藏以後就簡化了.h檔案,.c檔案複雜了,使用類的人當然是希望他要看到的.h檔案越簡單越好。而.c這部分程式碼通常是第三方並不關注的。 2、如何隱藏? 方法很多,這裡寫出兩種。

GObject 物件私有屬性模擬

轉載自 http://garfileo.is-programmer.com/2011/2/28/data-hiden.24848.html 上一篇文章“使用 GObject 庫模擬類的資料封裝形式”講述了 GObject 子類化過程,本文以其為基礎,進一步講述如何對資料進行隱藏,即對面向

函式指標、回撥函式與 GObject 閉包 GObject 物件的析構過程 GObject 的訊號機制——概覽

手冊所述,GObject 訊號(Gignal)主要用於特定事件與響應者之間的連線,它與作業系統級中的訊號沒有什麼關係。例如,當我向一個檔案中寫入資料的時候,我期望能夠有一個或多個函式響應這個“向檔案寫入資料”的事件,這一期望便可基於 GObject 訊號予以實現。 為了更好的理解 GObje

GObject 私有屬性的外部訪問

之前,寫了一篇 GObject 勸學的文章 [1],還有兩篇有關 GObject 子類物件資料封裝的文章 [2, 3]。 雖然,建立一個 GObject 子類物件需要一些輔助函式和巨集的支援,並且它們的內幕也令人費解,但是隻要將足夠的信任交託給 GObject 開發者

要求從使用者輸入的多行文字中提取學生的姓名、學號及登入日期,並封裝到 Student 中作為私有屬性。建立一個 Student 型別的物件陣列,對學號進行 升序排序並輸出

/*從鍵盤輸入多行文字,格式如下:學生端名稱,姓名,班級名稱,學生 ID,註冊時間 姜濤,姜濤,,20092212232,2011-11-4 9:06:56 任超,任超,,20092212239,2011-11-4 9:06:56 楊陽,楊陽,,20092212302,20

要求從使用者輸入的多行文字中提取學生的姓名、學號及登入日期,並封裝到 Student 中作為私有屬性。建立一個Student型別的物件陣列,對學號進行 升序排序並輸出。

/*部落格網站設定了校驗密碼的規則,編寫方法檢驗一個字串是否是合法的密碼。規則如下:  密碼長度在8-16之間  密碼只能包含字母和數字  密碼必須存在至少2個數字 如果使用者輸入的密碼符合規則就顯示valid password,否則提示Invalid passwor

物件繼承和沿用父物件屬性屬性

子類物件繼承和沿用父類物件的屬性和屬性值 如果在父類中,直接給屬性賦值或者是在無參建構函式中給屬性賦值,那麼如果子類物件中沒有給自己的屬性賦值,那子類物件就會沿用父類物件的屬性值,即子類物件直接把父類物件的屬性的值沿用下來了! /** * 父類物件和子類物件的問題 */ pu

引用指向物件屬性

父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal = new Cat(); 即宣告的是父類,實際指向的是子類的一個物件。 那這麼使用的優點是什麼,為什麼要這麼

Scala的私有屬性物件私有欄位

在Scala中,一個類定義了一個屬性,如果不是private的 var age=0 那麼它也會預設當成private級別的屬性,同時會預設生成setter和getter方法,當呼叫的時候,會通過age的函式來取得age的值,就是getter方法 而預設生成的setter方法

訪問私有屬性

-i cti func hack bject ces pri path RF 如何訪問類的私有屬性? 下面以 TPathData 為例,它有一個私有屬性 PathData,儲存了每一個曲線點,但一般無法修改它,需要利用下面方法,才能訪問修改(若有更好的方法,歡迎分享): 一

中的屬性跟父中的屬性重名的時候,會優先使用中的屬性

sta animal package 方法 pack stat ack har () package charter05; public class Animal { int age = 8; //如果父類中顯示的聲明了有參的構造方法, //而子類中沒有顯示的聲明有參構造方

物件變成物件

                                          &nb

c++父指標指向物件

c++父類指標指向子類物件   父類子類指標函式呼叫注意事項 1,如果以一個基礎類指標指向一個衍生類物件(派生類物件),那麼經由該指標只能訪問基礎類定義的函式(靜態聯翩) 2,如果以一個衍生類指標指向一個基礎類物件,必須先做強制轉型動作(explicit cast),這種做法很

WPFS資料繫結(要是後臺物件屬性值發生改變,通知在“客戶端介面與之繫結的控制元件值”也發生改變需要實現INotitypropertyChanged介面)

WPFS資料繫結(要是後臺類物件的屬性值發生改變,通知在“客戶端介面與之繫結的控制元件值”也發生改變需要實現INotitypropertyChanged介面) MainWindow.xaml 1 <Window x:Class="WpfApplication1.MainWindow" 2

Java——超物件之間的轉換

繼承是Java中常用的一項特性,通過繼承我們可以省去很多麻煩。 而Java中超類和子類物件之間的轉換則是很多新手的常遇見的難題,要是處理不好,恐怕會因為這個很特殊的問題導致一些潛在的危險,讓你整整一個晚上都在除錯程式以解決一個讓人抓狂的java.lang.ArrayStoreException異

物件物件之間可以相互轉換嗎

可以相互轉換。但是若父類物件想轉換為子類物件,父類物件一定是用子類物件初始化的。   那麼父類物件如何用子類物件初始化呢? 假設父類為A,子類為B,那麼用子類初始化程式碼為: A a=new B() 這就相當於我們用父類的控制代碼指向了子類的空間,如下圖所示:

關於父引用指向物件

以下內容參考https://www.cnblogs.com/ChrisMurphy/p/5054256.html 父類引用指向子類物件指的是: 例如父類Animal,子類Cat,Dog。其中Animal可以是類也可以是介面,Cat和Dog是繼承或實現Animal的子類。 Animal animal =

python私有屬性和公共屬性

對於python而言,類的屬性的可見度只有兩種,public和private。 類的私有屬性便是在前面加上“__”識別符號,而公共屬性則不必。 在類的外面訪問私有屬性會引發異常。 class Base: def __init__(self, value): self._

Java中在建立物件時有沒有建立父物件

我覺得在建立子類物件時,建立了父類物件,因為在new Student();時呼叫了Student的建構函式,而在子類的建構函式中,Student建構函式呼叫了父類的建構函式,這不就是建立物件嗎? class Person{ Person(){ } } class S

物件例項化過程

2018年11月05日 08:58:03 aprildusk 閱讀數:3 個人分類: java