GObject物件系統

2021-05-01 17:37:46 字數 2069 閱讀 9022

簡單的說,gobject物件系統是乙個建立在glib基礎上的,用c語言完成的,具有跨平台特色的、靈活的、可擴充套件的、非常容易對映到其它語言的物件導向的框架。如果你是乙個c語言的執著的追隨者,你沒有理由不研究一下它。
前言

大多數現代的計算機語言都帶有自己的型別和物件系統,並附帶演算法結構。正象glib提供的基本型別和演算法結構(如鍊表、雜湊表等)一樣,gobject的物件系統提供了一種靈活的、可擴充套件的、並容易對映(到其它語言)的物件導向的c語言框架。它的實質可以概括為:

型別(gtype)與物件(gobject)

glib中最有特色的是它的物件系統--gobject system,它是以gtype為基礎而實現的一套單根繼承的c語言的物件導向的框架。

gtype 是glib 執行時型別認證和管理系統。gtype api 是gobject的基礎系統,所以理解gtype是理解gobject的關鍵。gtype提供了註冊和管理所有基本資料型別、使用者定義物件和介面型別的技術實現。(注意:在運用任一gtype和gobject函式之前必需執行g_type_init()函式來初始化型別系統。)

為實現型別定製和註冊這一目的,所有型別必需是靜態的或動態的這二者之一。靜態的型別永遠不能在執行時載入或解除安裝,而動態的型別則可以。靜態型別由g_type_register_static()建立,通過gtypeinfo結構來取得型別的特殊資訊。動態型別則由g_type_register_dynamic()建立,用gtypeplugin結構來取代gtypeinfo,並且還包括g_type_plugin_*()系列api。這些註冊函式通常只執行一次,目的是取得它們返回的專有類的型別標識。

還可以用g_type_register_fundamental來註冊基礎型別,它同時需要gtypeinfo和gtypefundamentalinfo兩個結構,事實上大多數情況下這是不必要的,因為系統預先定義的基礎型別是優於使用者自定義的。

(本文重點介紹建立和使用靜態的型別。)

物件的定義

在gobject系統中,物件由三個部分組成:

物件的id標識(唯一,無符號長整型,所有此類物件共同的標識);

物件的類結構(唯一,結構型,由物件的所有例項共同擁有);

物件的例項(多個,結構型,物件的具體實現)。

基於gobject的物件到底是什麼樣的呢?下面是基於gobject的簡單物件 -- boy的定義**:

/* boy.h */

#ifndef __boy_h__

#define __boy_h__

#include #define boy_type (boy_get_type())

#define boy(obj) (g_type_check_instance_cast((obj),boy_type,boy))

typedef struct _boy boy;

typedef struct _boyclass boyclass;

struct _boy ;

struct _boyclass ;

gtype boy_get_type(void);

boy* boy_new(void);

int boy_get_age(boy *boy);

void boy_set_age(boy *boy, int age);

char* boy_get_name(boy *boy);

void boy_set_name(boy *boy, char *name);

boy* boy_new_with_name(gchar *name);

boy* boy_new_with_age(gint age);

boy* boy_new_with_name_and_age(gchar *name, gint age);

void boy_info(boy *boy);

#endif /* __boy_h__*/

以下上面鏈結

GObject物件系統 3

在gobject系統中,訊號是一種定製物件行為的手段,同時也是一種多種用途的通知機制。初學者可能是在gtk 中首先接觸到訊號這一概念的,事實上在普通的字元介面程式設計中也可以正常應用,這可能是很多初學者未曾想到的。乙個物件可以沒有訊號,也可以有多個訊號。當有一或多個訊號時,訊號的名稱定義是必不可少的...

gobject物件不宜作為動態載入的外掛程式

前段時間對 syncmanager進行重構,為了減少不必要的開銷,我決定在需要時才加syncsource外掛程式,不需要時就解除安裝它們。在測試時發現第一次執行時正 常,第二次執行時建立dbpersistance物件時失敗了。仔細看了下除錯資訊,裡面告訴我說註冊dbpersistance型別失敗,因...

如何定義和實現新的GObject之物件構造和析構

1 物件構造 在嘗試構建自己的gobjects時人們常常會感到困惑,因為它們有很多不同的方法來實現物件的構造過程 很難確定哪個是正確的方法。表4中,g object new 顯示了在物件例項化過程中呼叫的使用者提供的函式以及它們被呼叫的順序。instance init函式相當於c 中的建構函式。在所...