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するのはやめるべきかな。