【发布时间】:2013-01-10 07:47:06
【问题描述】:
在“ruby 编程语言”一书的第 7.3.5 章“继承和实例变量”中说:
因为与实例变量无关 继承,因此子类使用的实例变量不能“隐藏” 超类中的实例变量。如果子类使用具有相同的实例变量 名称作为其祖先之一使用的变量,它将覆盖其>祖先的值 多变的。这可以有意地改变祖先的行为,或者它可以 不经意间就完成了。在后一种情况下,几乎可以肯定会导致错误。与 继承前面描述的私有方法,这也是为什么它只是 当您熟悉(并控制)Ruby 类时,可以安全地扩展 超类的实现。
我做了自己的测试,但似乎子类中的实例变量不会影响超类
我的 Ruby 版本
bob@bob-ruby:~$ ruby --version
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
bob@bob-ruby:~$
下面是代码
class Point
attr_accessor :x,:y
def initialize(x,y)
@x,@y=x,y
end
end
class Point3D < Point
attr_accessor :x,:y,:z
def initialize(x,y,z)
@x=x
@y=y
@z=z
end
end
irb(main):052:0> p=Point.new(1,2)
=> #<Point:0x87e8968 @x=1, @y=2>
irb(main):053:0> q=Point3D.new(4,5,6)
=> #<Point3D:0x87e423c @x=4, @y=5, @z=6>
irb(main):054:0> q.x
=> 4
irb(main):055:0> p.x
=> 1
irb(main):056:0>
【问题讨论】:
-
嗯,这些是“实例”变量,这里有 2 个类的 2 个独立实例,你期望什么?
-
是的,这就是我的困惑。因为书上说它会覆盖超类的值,书错了吗?
-
@ailms 不,你错误地认为当你有一个类的两个实例时,在一个类中设置一个实例变量会影响另一个。书上说,如果你在超类中设置值(如在ctor中)然后在子类中设置它,子类的值获胜。
-
@Dave Newton :我不认为有两个 same 类的实例。我有两个不同类的 2 个实例。这本书说它将改变超类的行为,但是如果子类的实例变量与超类的实例变量没有关系,CAN它'改变行为'并导致错误?
-
@ailms 出于空间和格式原因将评论移至答案。
标签: ruby inheritance subclass instance-variables superclass