疑問点 その二
前回は、classboxで拡張したフィールドの初期化と参照の関係をどう保証するのか、という疑問点について書いた。
今回は、あるclassboxの中でimportと定義のどちらもされていないクラスのインスタンスが参照された場合の問題を考える。今度も擬似Rubyコードで書く。
以下の例では、classbox Barの中のA.get()でBクラスのインスタンスが返されるが、BクラスはBarの中でimportも定義もされていない。
classbox Foo class A def a(); end end class B < A def a(); end end class C < A def a(); end end def A.get(); B.new(); end end classbox Bar import A from Foo def main(args) A.get.a() end end
このようなことは、型宣言のない言語だけで生じるわけではない。型宣言のある言語であっても、A.get()の戻り値の型をAと宣言すれば同様である。
A.get.a()が実行された時点で、どのような動作をすべきだろうか?
- エラーにする
- 宣言されている型で実行 (型宣言のある言語のとき)
- default import classbox機能で解決
最初の案は、実際に使われるクラスは全部importしろ、という意味になるが、Barの中でB, Cクラスのimportを強制されるのは非常に面白くない。三番目の案は、それぞれのclassboxでインスタンスのクラスが未定義の場合に参照するデフォルトclassboxを宣言しておいて、そのclassboxで処理を行うという意味である。
上記の案はどれもあまり良い感じがしない。実は、もう一つ案があるのだが、これは内緒にしておこう。