In message "[ruby-list:18853] initializer polymorphism?"
on 99/11/23, Takeyuki Watadani <watadani / tubulin.cb.m.u-tokyo.ac.jp> writes:
>Rubyで、あるクラスのインスタンスを複数の方法で生成したいので
>すが、
>
>class A
> def initialize(a,b)
> ...
> end
>
> def initialize(c,d,e)
> ...
> end
>end
>
>のように書くと見事にinitializeが再定義されてしまいます。イン
initialize は A.new から呼ばれるものです。
>#*つきの仮引数を書いて、initializeの中で条件分岐して…って
>#のも考えたんですが。
それが一つの方法ですね。別解としては下のようなのがあります。
class A
class << self
alias __new__ new
end
def A.new(*arg)
__new__(*arg).instance_eval{init1(*arg); self}
end
def A.new2(*arg)
__new__(*arg).instance_eval{init2(*arg); self}
end
private
def initialize(*arg)
@common = arg[0]
end
def init1(*arg)
@a = arg[1]
end
def init2(*arg)
@b = arg[1]
end
end
p A.new(1,2) #=> #<A: @common=1, @a=2>
p A.new2(1,2) #=> #<A: @common=1, @b=2>
-- gotoken