小编ail*_*lms的帖子

Ruby可以子类化实例变量_overwrite_超类(同名)吗?

在"ruby编程语言"一书的第7.3.5节"继承和实例变量"中说:

因为实例变量与继承无关,所以子类使用的实例变量不能"遮蔽"超类中的实例变量.如果子类使用与其祖先之一使用的变量同名的实例变量,则它将覆盖其> ancestor变量的值.这可以有意地完成,以改变祖先的行为,或者可以无意中完成.在后一种情况下,几乎可以肯定会导致错误.与前面描述的私有方法的继承一样,这是为什么在熟悉(和控制)超类的实现时扩展Ruby类是安全的另一个原因.

我做了自己的测试,但似乎来自子类的实例变量不会影响超类

我的Ruby版本

bob@bob-ruby:~$ ruby --version
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]
bob@bob-ruby:~$ 
Run Code Online (Sandbox Code Playgroud)

下面是代码

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> 
Run Code Online (Sandbox Code Playgroud)

ruby inheritance subclass instance-variables superclass

4
推荐指数
1
解决办法
5843
查看次数