まつもと ゆきひろです

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って名前は
適切だとは思いませんが,とりあえずということで.

                                まつもと ゆきひろ /:|)