まつもと ゆきひろです
In message "[ruby-list:9391] Re: Delegator"
on 98/09/01, ttate / jaist.ac.jp <ttate / jaist.ac.jp> writes:
|立石です。
|こちらは、DelegateClass(Foo)によって生成させた
|クラスにinitializeを再定義する必要があるため
|DelegateClass(Foo).new という書き方はできない
|ようです。
あ,そうか.DelegateClassはデフォルトでは転送先を明示的に指
定する仕様でしたね.こういう感じでないと
foo = DelegateClass(Foo).new(Foo.new)
def foo.say
...
super
end
|aliasを使ってごまかすよりもこちらの方法で
|なんとか initialize 再定義の手間を省けないか考えた
|のですが次のような感じの修正はいかがでしょう?
うーむ,これだと現在の「転送先を明示的に指定する」仕様から
「転送先を勝手に生成する」仕様に変更してることになりますよね.
しかも,逆(既存のオブジェクトを転送先にすること)は出来ないと
いうことも意味します.
foo = DelegateClass(Foo).new
とできるのは便利ですが,そこまでの変更は受け入れにくいです.
# とはいえ,書いた本人も忘れている仕様にこだわる必要があるの
# かってツッコミはアリでしょうけど.^^;;;
たとえば
def WrapClass(superclass)
klass = DelegateClass(superclass)
klass.module_eval <<EOS
def initialize(obj)
@obj = #{superclass}.new(*argv)
end
EOS
end
なんてを作るとかが良いのかも知れません.WrapClassって名前は
適切だとは思いませんが,とりあえずということで.
まつもと ゆきひろ /:|)