Rubyのinitializeメソッドの継承

スポンサーリンク
スポンサーリンク
ライフスタイル関連のコンテンツ
お金 | 仕事 | 勉強 | プライベート | 健康 |
プログラミング関連のコンテンツ
C言語/C++入門 | Ruby入門 | Python入門 | プログラミング全般

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の引数をとりますので、エラーとなります。

スポンサーリンク
 
スポンサーリンク