疑問点 その一

2006/03/20の書き込みの続き。

classboxで拡張したフィールドの初期化と参照の関係をどう保証するのか、というのが最初の疑問点である。Javaで書くとタイピング量が増えるので、擬似Rubyコードで書く。

classbox Foo
  class A; end
  class B < A; end
end

classbox Bar
  import A, B from Foo

  class A
    def a(); make_b(); end
  end

  class B
    def initialize; @bar = 100; end
    def make_b(); B.new; end
    def b(); @bar; end
  end
end

classbox Baz
  import A, B from Foo

  class B
    def initialize; @baz = "abc"; end
    def b(); @baz; end
  end

  class C
    def c(x); x.b(); end
  end

  class D < C; end
end

classbox Main
  import B from Bar
  import D from Baz

  def main(argv)
    b = B.new.a()
    p D.new.c(b)
  end
end

main()の中の、B.new.a()で返される値は、Bar環境で生成されたBクラスインスタンスであり、D.new.c()の呼び出しの中ではBaz環境に入るので、B#b()で参照されるのは@bazのほうになる。従って、未初期化状態のインスタンス変数が参照されてしまう。
この程度のことは、アプリケーションで起きないように注意すべきということになるのかもしれないが。