クラスインスタンス変数は継承されるか

Posted by Yoichiro Hasebe Thu, 28 Feb 2008 13:15:00 GMT

RHGによると、クラスの特異クラスはスーパークラスの特異クラスを継承している。

ということは、クラスメソッドはサブクラスに受け継がれるということだ。ならばクラスインスタンス変数はどうなんだろう?これもサブクラスに受け継がれるのだろうか?

class Bird
  #クラスインスタンス変数の設定
  @can_fly = true
  #特異クラスにアクセス
  class << self
    #クラスメソッドの設定
    def can_fly?
      @can_fly
    end
  end
end

class Sparrow < Bird
  #クラスインスタンス変数の再設定
  @can_fly = true
end

class Penguin < Bird
  #クラスインスタンス変数の再設定
  @can_fly = false
end

class Ostrich < Bird
  #クラスインスタンス変数を設定しない
end

puts "Bird can fly: " + Bird.can_fly?.to_s
puts "Sparrow can fly " + Sparrow.can_fly?.to_s
puts "Penguin can fly: " + Penguin.can_fly?.to_s
puts "Ostrich can fly: " + Ostrich.can_fly?.to_s

これを実行すると

Bird can fly: true
Sparrow can fly true
Penguin can fly: false
Ostrich can fly:

確かにクラスメソッドは継承されるけど、クラスインスタンス変数は継承されないことが分かった。考えてみるとクラス「インスタンス」変数なんだから当たり前だ。でもこうやってはっきり確認すると気持ちがいい。

Posted in  | Tags

Comments are disabled