めもらんだむ

メモ書きです。

self.class: サブクラスにクラスを継承するための定義

  • メソッド定義中に、「自分のクラス名」ではなく、「self.class」を用いて定義しておくと、サブクラスでは、サブクラスとして扱われる。
  • 自分自身のクラスのインスタンスを返すフィルタ的なメソッドをサブクラスでも再定義なしに継承できる。
class Class1
  def initialize(x)
    @var = x
  end
  
  def show
    puts @var
  end
  
  def double
    return Class1.new(@var * 2)
  end
end

class Class2 < Class1
  def triple
    return Class2.new(@var * 3)
  end
end

a = Class2.new(7)
b = a.double
c = b.triple  # -> エラー:undefined method `triple'

Class1#doubleの返し値がClass1のインスタンスのため、tripleメソッドが使えずエラーになってしまう。
このClass1#doubleを下記のように定義しておくと、bのクラスがClass2となりエラーを回避できる。

  def double
    return self.class.new(@var *2)
  end

同様に、Class2#tripleも「Class2.new」でなく「self.class.new」を使って定義しておくと、サブクラスに返し値のクラスを継承できる。