2006/03/25の続き

前回、classboxで拡張したフィールドの初期化と参照の関係をどう保証するのか、という疑問点を書いた。しかし、若しRubyのように実行時の代入によってインスタンス変数が割り当てられる言語で、未定義インスタンス変数の参照はエラーとするという仕様であれば(Rubyはそうではないが)、そのエラーによってチェックだけはできる。
以下の例で言うと、Bazの中のB#b()の@bazの参照が未定義エラーとなる。

classbox Foo
  class A; end
  class B < A
    def b(); raise "extended classbox responsibility"; end
    def self.set(x); @x = x; end
    def self.get(); @x; end
  end
end

classbox Bar
  import A, B from Foo

  class A
    def a(); B.make(); end
  end

  class B
    def initialize; @bar = 100; end
    def b(); @bar; end
    def self.make(); B.set(B.new); end
  end
end

classbox Baz
  import A, B from Foo

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

  class C
    def c(); B.get().b(); end
  end

  class D < C; end
end

classbox Main
  import B from Bar
  import D from Baz

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

実を言うと、Rubyで未代入のインスタンス変数を参照してもエラーにならないというのは、さっき初めて知った。(警告は出せる)