我在试着理解继承:
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时,我得到了6,而我期待的是4。
我正在学习的Ruby教程说它应该是4。显然,Larry.whee应该返回6。
顺便说一下,我添加了"wheel“和"whee”函数,这样我就可以看到这些值了。有人能解释一下这里出了什么问题吗?
发布于 2012-09-06 02:49:53
Ruby中的类变量是strange和confusing。
实现你想要的东西的惯用方法是这样的:
class Car
def wheels
4
end
end
class StretchLimo < Car
def wheels
6
end
end
Car.new.wheels #=> 4
StretchLimo.new.wheels #=> 6发生的情况是类变量在类的所有实例之间共享。因为StrechLimo是Car的子类,所以StrechLimo的实例也可以看到这个变量。
发布于 2012-09-06 02:38:56
@@是一个类变量,因此它在从给定类和所有派生类实例化的所有对象之间共享。因为Ruby是解释型的,所以在实例化StretchLimo对象之前,它不应该查看任何StretchLimo代码,所以如果您执行了以下操作:
moe = Car.new
moe.wheel # should give 4
larry = StretchLimo.new
moe.wheel # should give 6因为当解释StretchLimo时,它会将@@wheels类变量更新为6。另一方面,如果您声明的“轮子”只有一个"@“(@wheels),那么它将是一个特定于对象本身的实例变量,并且您将获得您喜欢的行为。
https://stackoverflow.com/questions/12287618
复制相似问题