Classbox/R
久しぶりにClassboxについて少しだけ考えた。
かなり前の書き込みで、最終的に実行される時点でのClassboxがどのように決定されるのかについて以下のように推測した。
- インスタンスオブジェクトについては、そのインスタンスの生成が記述されたコード上の位置のclassbox
- クラスオブジェクトについては、classbox階層の中でそのクラスが最終的に拡張/定義されたclassbox
若しメソッドの追加/変更だけでなく、フィールドの追加/変更もClassboxで可能とするのなら、インスタンスオブジェクトが属するClassboxは実行中不変でなければならないので、上記の仕様は自然であることに気付いた。尤も、Classboxの論文にはフィールドの追加、変更に関しては何も書かれていないように見えたが。
しかし上記の仕様だと、複雑なインスタンス生成を行うプログラムに対して、その一部のインスタンスだけを拡張Classboxのインスタンスに変更したい場合に、インスタンス生成コードをコピーしたもので再定義する必要が生じる。
classbox Base class X; end class Y; end class Z; end class Factory def self.createCompound() ... create compound of X, Y and Z ... end end end classbox Foo < Base class Y; ... ; end class Factory # Y is created as Foo classbox instance. def self.createCompound() ... same code of createCompound in Base classbox ... end end
これを避けるためには、指定した範囲内のコードで生成されるインスタンスの属するclassboxを強制できる機能が必要かもしれない。
classbox Foo < Base class Y; ... ; end class Z; ... ; end class Factory def self.createCompound() use Y, Z { # Y, ZインスタンスはFooとして生成する original() } end end end