Rubyの継承

スーパークラスのメソッドを継承する際の引数で混乱したので、自分なりにまとめてみた。

class Sup
  attr_reader :x
  def initialize  #引き継がれない
    @x=4
  end
  def initialize(x)
    @x=x-3
  end
end

class Sub < Sup
  attr_reader :y
  def initialize(y)
    super
    @y=y
  end
end

obj=Sub.new(6)
p obj.x #=> 3
p obj.y #=> 6

引数なしのinitializeを呼んだつもりだったのだが、どうやらsuperは引数をそのまま渡しているみたいだ。

引数を渡す

class Sup
  attr_reader :x
  def initialize
    @x=4
  end
  def initialize(x)
    @x=x-3
  end
end

class Sub < Sup
  attr_reader :y
  def initialize(y)
    super(3)  #任意の引数でinitializeを呼べる
    @y=y
  end
end

obj=Sub.new(6)
p obj.x #=>0
p obj.y #=>6

引数なしのsuperだとサブクラスの引数がそのまま渡されるみたい
しかしここで super()にするとエラーが出る。扱いが違うのか

ということでデフォルト引数を設定してみる

class Sup
  attr_reader :x
  def initialize(x=4) #デフォルトで引数を設定しておく
    @x=x
  end
end

class Sub < Sup
  attr_reader :y
  def initialize(y)
    super()
    @y=y
  end
end

obj=Sub.new(6)
p obj.x #=>4
p obj.y #=>6

うまくいった。スマートな方法かわからないけど