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の引数をとりますので、エラーとなります。
■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/469