0

私は継承を理解しようとしています:

class Car
  @@wheels = 4
  def wheel
    @@wheels
  end
end

class StretchLimo < Car
  @@wheels = 6
  def whee
    @@wheels
  end
  def turn_on_television
  end
end

私はそのようにいくつかのオブジェクトをインスタンス化します:

moe = Car.new
larry = StretchLimo.new

私がそうするとき、私は私が期待しているときにmoe.wheel、私は得る。64

私がフォローしているRubyチュートリアルは、そうなるはずだと言っています4Larry.whee明らかに戻る必要があり6ます。

ちなみに、値がわかるように「wheel」と「whee」の関数を追加しました。誰かがここで何が悪いのか説明できますか?

4

2 に答える 2

1

Ruby のクラス変数は奇妙紛らわしいものです。

必要なものを実装する慣用的な方法は次のとおりです。

class Car
  def wheels
    4
  end
end

class StretchLimo < Car
  def wheels
    6
  end
end

Car.new.wheels #=> 4
StretchLimo.new.wheels #=> 6

クラス変数は、クラスのすべてのインスタンス間で共有されます。のインスタンスのStrechLimoサブクラスであるため、この変数も参照してください。CarStrechLimo

于 2012-09-05T18:49:53.267 に答える
0

@@はクラス変数であるため、特定のクラスからインスタンス化されたすべてのオブジェクトとすべての派生クラスで共有されます。Ruby は解釈されるため、StretchLimoオブジェクトをインスタンス化するまでは、どのStretchLimoコードも見てはいけません。

moe = Car.new
moe.wheel # should give 4
larry = StretchLimo.new
moe.wheel # should give 6

が解釈されると、クラス変数がStretchLimoに更新されるためです。一方、" " ( ) を 1 つだけ使用して "wheels" を宣言すると、オブジェクト自体に固有のインスタンス変数になり、好みの動作が得られます。@@wheels6@@wheels

于 2012-09-05T18:38:56.443 に答える