トップ «前の日記(2007-06-20) 最新 次の日記(2007-06-22)» 月表示 編集

日々の流転


2007-06-21 [長年日記]

λ. g_type_is_a()は推移的でない

今日、初めて気付いたのだけど、g_type_is_a()は推移的(transitive)ではないのだな。 例えば、g_type_is_a(GTK_ENTRY, GTK_EDITABLE) かつ g_type_is_a(GTK_EDITABLE, G_TYPE_INTERFACE) であるにも関わらず、g_type_is_a(GTK_ENTRY, G_TYPE_INTERFACE) ではない。

これは「GTK_ENTRYGTK_EDITABLE インターフェースを実装した型である」という is-subtype-of 関係と、「GTK_EDITABLE は基本型 G_TYPE_INTERFACE に属する」という一種の is-instance-of 関係の、二つの異なる概念を同じ述語で表現してしまっているためだろう。 気持悪いよ……

Ruby-GNOME2ではgtkの型をRubyのClass/Moduleにマッピングして、g_type_is_a()Module#<= に対応するようにしていたのだけど、Module#<= は当然推移的なので、Gtk::Entry <= GLib::Interface も成り立ってしまっている。 しかし、これは気持悪いので、Gtk::Editable のような個々のインターフェースに GLib::Interface をincludeするのはやめるべきかな。

Tags: gtk ruby