yohasebe.com


Thu Feb 28 22:15:00 +0900 2008

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

Ruby

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:

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

Prev entry | | Next entry



大学関係


計算機プログラミング


その他いろいろ


--