Rubyのinitializeメソッドの継承

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

Rubyでは、サブクラスでinitializeメソッド(C++やJavaでのコンストラクタに相当するメソッド)を定義しなかった場合、スーパークラスのinitializeメソッドが自動的に継承されます。

サブクラスでinitializeメソッドを定義しない場合

class RubySuperClass
  def initialize(x, y)
    @x = x
    @y = y
  end
  attr_accessor :x, :y
end
 
class RubySubClass < RubySuperClass
  def display
    puts(self.x << "、" << self.y)
  end
end
 
o1 = RubySubClass.new('こんにちは', '山田さん')
o1.display

実行結果。

こんにちは、山田さん

サブクラスが、自動的にスーパークラスのinitializeメソッドを継承していることを確認できます。


サブクラスでinitializeメソッドを定義した場合

class RubySuperClass
  def initialize(x, y)
    @x = x
    @y = y
  end
  attr_accessor :x, :y
end
 
class RubySubClass < RubySuperClass
  def initialize(x, y)
  end
  def display
    puts(self.x << "、" << self.y)
  end
end
 
o1 = RubySubClass.new('こんにちは', '山田さん')
o1.display

def initialize(x, y) をサブクラスで定義してはいますが、中身は空。
この場合、自動的にスーパークラスのinitializeメソッドを継承することはなく、displayメソッドでエラーが発生します。
def initialize(x, y) を定義する場合、スーパークラスのinitializeメソッドを呼び出すには、superで明示的に呼び出す必要がある。


superで明示的にスーパークラスのinitializeメソッドを呼び出す

class RubySuperClass
  def initialize(x, y)
    @x = x
    @y = y
  end
  attr_accessor :x, :y
end
 
class RubySubClass < RubySuperClass
  def initialize(x, y)
    super
  end
  def display
    puts(self.x << "、" << self.y)
  end
end
 
o1 = RubySubClass.new('こんにちは', '山田さん')
o1.display

実行結果。

こんにちは、山田さん

initializeメソッドをサブクラスでオーバーライドした場合、superと書くと、引数をそのままスーパークラスのinitializeメソッドに渡します。
ここをsuper()と括弧付きで書くと、引数を渡さずにスーパークラスのinitializeメソッドを呼び出し、この例の場合では、スーパークラスのinitializeメソッドはx, yの引数をとりますので、エラーとなります。


日時: 2009年02月16日 01:36
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/469

この記事にトラックバックされる方は、参照先が分かるようにするために、「Rubyのinitializeメソッドの継承」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - Ruby勉強ルーム