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_ENTRY は GTK_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するのはやめるべきかな。
[ツッコミを入れる]
