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で未代入のインスタンス変数を参照してもエラーにならないというのは、さっき初めて知った。(警告は出せる)