GObject
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/10/03 03:43 UTC 版)
この記事の出典や参考文献は、一次資料や記事主題の関係者による情報源に頼っています。 |
歴史
GLibとlibcにのみ依存しており、GNOMEの基礎として GTK、Pango、Accessibility Toolkit、多くのGNOMEライブラリやアプリケーションなど広範囲に利用されている。GTK 2.0以前は、GObjectのコードはGTK+の一部だった。ただし、当時はGObjectとは呼ばれておらず、ベースクラスは GtkObject
と呼ばれていた。
GTK 2.0リリースの際に、オブジェクトシステムを汎用ユーティリティとすべく、別ライブラリとして分離した。その際にGUI関係でない GtkObject
クラスの大部分は新たなベースクラスである GObject
に移された。GTK 2.0のリリースされた2002年3月11日以降、GObjectは独立したライブラリとして存在し続け、現在ではGUI以外のCUIアプリケーションやサーバアプリケーションにも広く使われている。
GLibとの関係
GObjectのマニュアル等はGLibとは別にあり[1]、ライブラリファイルとしても別になっているが、ソースコードはGLibのソースツリー内にあって、GLibと共に配布されている。このため、GObjectのバージョン番号はGLibのものを使っており、GLibパッケージの一部とされることが多い(例えば、DebianではGObjectを libglib2.0
パッケージファミリに入れている)。
型システム
GObjectフレームワークの基盤として、汎用の動的型システム GType がある。GTypeシステムは全オブジェクトの実行時記述を保持し、各種言語バインディングを実現するグルーコードからそれを使うことができる。型システムは任意の単一継承クラス階層を扱え、同時にクラスでないデータ型も扱える(不透明ポインタ、文字列、各種サイズの整数と浮動小数点数など)。
GTypeは登録されている型に属する値のコピー、代入、破棄の方法を知っている。整数などの型ではこれらは自明だが、複雑なオブジェクトには参照カウントがあるものもあれば、(一部だが)参照カウントのないものもある。型システムが参照カウントのあるオブジェクトを「コピー」するとき、一般に単に参照カウントをインクリメントするだけである。しかし、参照カウントのないオブジェクト(例えば文字列)のコピーでは、メモリを確保して実際にコピーを生成する。
この基本機能を使って GValue
が実装されている。これは汎用コンテナ型であり、型システムが把握している任意の型の値を保持できる。このようなコンテナは、全てのネイティブ値をそのような型タグコンテナに格納する動的型付き言語とやりとりする際に特に便利である。
基本型
クラスと関連のない型を non-classed と称する。そのような型と何らかの rootクラスに対応した全ての型を総称して「基本型」と呼び、それ以外の型を「派生型」と呼ぶ。これらは比較的閉じた体系であり、一般ユーザーが独自の基本型を生成することはないものと想定されているが、生成は可能であり、GObject
クラスに基づかないクラス階層を独自に作ることもできる。
GLib 2.9.2[2]では、non-classed の基本型は以下の通りである。
- 空の型、C言語の
void
に対応。(G_TYPE_NONE
) - C言語の
char
、int
、long
、64ビット整数に対応した型。(G_TYPE_CHAR
,G_TYPE_UCHAR
,G_TYPE_INT
,G_TYPE_UINT
,G_TYPE_LONG
,G_TYPE_ULONG
,G_TYPE_INT64
,G_TYPE_UINT64
) - ブーリアン型。(
G_TYPE_BOOLEAN
) - 列挙型とフラグ型。C言語の
enum
に対応するが、後者はビットフィールドにのみ使われる。(G_TYPE_ENUM
,G_TYPE_FLAGS
) - IEEE 754の単精度および倍精度の浮動小数点数。C言語の
float
とdouble
に対応。(G_TYPE_FLOAT
,G_TYPE_DOUBLE
) - 文字列型。C言語の
char *
に対応。(G_TYPE_STRING
) - 不透明ポインタ型。C言語の
void *
に対応。(G_TYPE_POINTER
)
classed の基本型は以下の通りである。
- 標準クラス継承ツリーのrootである
GObject
のインスタンスの基底クラス型。(G_TYPE_OBJECT
) - 基底インタフェース型。標準インタフェース継承ツリーの rootを表している。(
G_TYPE_INTERFACE
) - ボックス化用の型。単純な値オブジェクトや外部オブジェクトを参照カウント付きの「ボックス」で包むのに使われる。(
G_TYPE_BOXED
) - 「パラメータ記述オブジェクト(parameter specification object)」用の型。オブジェクトのプロパティのメタデータを記述するのに使われる。(
G_TYPE_PARAM
)
型システムによって自動的にインスタンス化できる型を instantiable と称する。そのような型の重要な特徴は、インスタンスの先頭数バイトに必ずその型に対応したクラス構造(一種の仮想関数テーブル)へのポインタが格納されている点である。このため、instantiableな型は必ずクラスと対応している。逆にnon-classedな型(整数や文字列)は instantiableではない。また、classedな型はインタフェース型などを除いてinstantiableである。
派生型
GObjectの組み込みの基本型から派生する型は4種類に分けられる。
- 列挙型とフラグ型
- オブジェクトシステムとの関連で何らかの形で使われる列挙型や整数ベースのビットフィールド型(すなわち、全ての
enum
型)。例えば、オブジェクトのプロパティの型など。一般にこれらの型の登録を行う初期化コードはglib-mkenums
[3]というツールで自動生成され、別ファイルに格納される。 - ボックス化型
- 完全なクラス型にするには単純すぎるデータ構造だが、型システムに登録する必要があるもの。例えば、あるクラスに
background-color
というプロパティを追加したいとする。その値はstruct color { int r, g, b; }
のようなデータ構造のインスタンスである。これをGObject
のサブクラスにしたくない場合、ボックス化型で表し、コピーや解放といった機能を提供できる。GObjectにはGLibの単純なデータ型を包んだ各種ボックス化型が最初から備わっている。ボックス化型は、外部オブジェクトのタグ付きコンテナとしても使える。 - 不透明ポインタ型
- 場合によっては、コピーや解放といった機能も不要で、ボックス化型でも大げさすぎるというオブジェクトもある。そのようなオブジェクトは単に不透明ポインタ (
G_TYPE_POINTER
) として扱っても良いが、派生ポインタ型を生成することで、それがある特定用途のオブジェクトであることを示すことができる。 - クラス型とインタフェース型
- GObjectアプリケーションにおける大半の型はクラス型であり、通常のオブジェクト指向的な感覚で言えば、rootクラス
GObject
から直接または間接的に派生する。Java風のインタフェースもあるが、2006年現在ではあまり使用されていない(2004年3月16日にリリースされたGLib 2.4あたりで導入された新機能であるため)。GIMPはGObjectのインタフェース型を使っている。
メッセージング・システム
GObjectのメッセージングシステムは、相補的な closure と signal から構成される。
- Closure
- コールバックを一般化したもの。C言語とC++以外にもバインディングがある言語から使える。例えば、PythonやJavaのコードをClosureの機構で GObjectから呼び出すことができる。
- Signal
- Closureを呼び出す一次機構。オブジェクトは、あるSignalとClosureのマッピングを指定したSignalリスナーを登録する。登録されたSignalが発信されると、対応するClosureが呼び出される。GTKでは、全てのネイティブGUIイベント(マウスの動きやキーボード操作)はGObjectのSignalを発信でき、対応するリスナーがそれに対して動作する。
- ^ GObject Reference ManualArchived 2007年7月3日, at the Wayback Machine.
- ^ GTypeArchived 2007年6月9日, at the Wayback Machine.
- ^ glib-mkenumsArchived 2007年8月12日, at the Wayback Machine.
- ^ GObject Builder
- 1 GObjectとは
- 2 GObjectの概要
- 3 クラス実装
- 4 利用
- 5 外部リンク
固有名詞の分類
- GObjectのページへのリンク