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」を使って定義しておくと、サブクラスに返し値のクラスを継承できる。