継承ツリーの最上位クラス

カメよりも遅い歩みですがいちおうDiksamは機能追加を続けているので、たまには言語の話も。

JavaC#には、継承ツリーの最上位クラスとして「Object」がいます。型なし言語にもたいていは同様のクラスがありますね。
C++にはありませんが、それは、template(JavaでいえばGenerics)がその役目を果たしているから、ということであると私は理解しています。

ではDiksamではどうすべきか。まず、Objectというのは、「何でも指せる参照」であり、Cで言えばvoid*に相当する最も邪悪なポインタです。なるべくならこんなものの導入は避けたい。でも、templateやGenericsを実装するのはひとりでやるのは骨なので、残念ながらそう簡単に導入できるとは思えない。

じゃあ実利的な意味からObjectを導入するか、と、そこまではいいのですが、JavaのObjectの仕様にはもうひとつ気になっているところがあります。

かつて、JavaHouseの以下の記事あたりで話題になったのですが、

http://java-house.jp/ml/archive/j-h-b/035187.html

たとえばHogeというインタフェースがあったとき、「Hoge hoge;」として宣言された変数hogeについては、なぜかObjectのメソッドであるtoString()等が呼べます。もちろん、実際にインスタンス化されたとき、そのオブジェクトは絶対にObjectのサブクラスであるわけですが、インタフェースであるHogeのクラス階層を辿ってみてもObjectは登場しない。にも関わらず「Hoge hoge;」と宣言されたhogeのtoString()が呼べてしまうのは、言語仕様上特別扱いされているからであって、私もやっぱり「汚い仕様ですよね」と思います。

http://java-house.jp/ml/archive/j-h-b/035211.html

ここはやっぱりJavaHouseで議論されているように、Objectableインタフェースを導入のうえ、すべてのインタフェースとObjectクラスが暗黙にObjectableをimplementsするようにするのがよいのか、あるいはObjectableインタフェースを導入しすべてのインタフェースとクラスが暗黙にObjectableをimplementsするようにすればObjectなんか要らないのか、その辺をどうすべきか逡巡しているところです。