6/04/2011

GObject 簡介


GObject是GLib提供的物件系統,主要目的在透過此系統為C programming language加入物件導向的功能。此外,它還定義了一套資料交換(property setter/getter)的介面,加強其他程式語言跟基於GObject/GLib撰寫的函式庫間的互通性(interoperability)。尤其是預計隨GTK+ 3.0公佈的GObject Introspection,將大大簡化GLib與其他程式語言的連結性。GObject可說是GLib與GTK+的基石,諸如:GIO、GTK+提供之的各項元件均大量運用GObject。至於,GObject內建之事件系統(messaging system)也能幫助使用者輕鬆開發由事件驅動(event driven)之程式。

GObject之特性:
  1. 單一繼承與多重介面
  2. 統一的屬性存取方法
  3. 內建訊號處理機制
單一繼承與多重介面
與單一繼承與多重繼承優劣之相關爭論在物件導向程式設計領域由來已久,GObject目前僅支援單一繼承加上多重介面的形式。簡單說,所有的承襲自GOjbject的物件僅能有一個父類別,而GObject類別自然位於此繼承體系的頂端;在類別繼承之外,GObject系統亦允許使用者為類別實作多個的介面。

統一的屬性存取方式
如果某類別有改寫(override)GObject類別之set_property()以及get_property(),則可以透過g_object_set_propertyg_object_get_property利用屬性名稱存取物件之屬性。這樣的操作雖然有點繁瑣,但是透過這樣的方式可以完整地實現資料封裝,如果有考慮替程式添加與其他程式語言(例如:Python, Ruby, Lua... etc.)之連結(binding),實做這樣的介面將為撰寫language binding節省不少時間。目前許多programming language業已實做GObject introspection,未來甚至不需要為特定語言再撰寫binding, 只要提供gir即可。

內建訊號處理模型
GObject提供一組類別封裝了callback函式,稱作Closure。可於執行時期,與特定訊號(signals)連結,爾後當訊號發送時,GObject系統將自動派送並喚起相應的closure。

No comments:

Post a Comment