2008年9月3日水曜日

Rubyでコンストラクタの多重定義(オーバーロード,オーバーローディング) ってできないの?

Rubyでコンストラクタの多重定義(オーバーロード,オーバーローディング) ってできないの?

出来ないらしい。
そもそも、メソッド(関数)の多重定義が出来ないから出来ないのもあたりまえ。

コンストラクタを多重定義するには、スタティック(静的)関数を定義すると出来る。




class Vector


def initialize(x,y)
 @x = x
 @y = y
end

def self.NewUnit()
 obj = Vector.new(1,1)
 return obj
end


end


v1 = Vector.new(3,4)
p v1

v2 = Vector.NewUnit()
p v2




def self.NewUnit()

で静的なメソッドを定義し、その中でオブジェクトを作成し戻り値にし返します。

v2 = Vector.NewUnit()

のような形でオブジェクトの生成が出来るようになるわけです。
もし、メソッド名initialize()で多重定義関数のような振る舞いをさせるには、
Rubyでは引数にいろいろな型を渡すことができるので、initialize()内で
渡された引数の型を調べ内部で分岐するようにすれば出来ます。しかし、それではあまりにも美しくないし、バグの温床にもなりおすすめできません。
メソッドを分けて作ったほうがいいでしょう。

0 件のコメント: