Ruby 实例变量继承

Ruby 实例变量继承,ruby,inheritance,instance-variables,Ruby,Inheritance,Instance Variables,有人能解释一个类如何访问其超类的实例变量,以及这不是继承吗?我说的是“Ruby编程语言”和示例 class Point def initialize(x,y) # Initialize method @x,@y = x, y # Sets initial values for instance variables end end class Point3D < Point def initialize(x,y,z) super(x,y) @z

有人能解释一个类如何访问其超类的实例变量,以及这不是继承吗?我说的是“Ruby编程语言”和示例

class Point
  def initialize(x,y) # Initialize method 
     @x,@y = x, y      # Sets initial values for instance variables
  end

end

class Point3D < Point
 def initialize(x,y,z)
   super(x,y)
   @z = z
 end
 def to_s
   "(#@x, #@y, #@z)"  # Variables @x and @y inherited?
 end
end

Point3D.new(1,2,3).to_s => "(1, 2, 3)"
类点
def初始化(x,y)#初始化方法
@x、 @y=x,y#设置实例变量的初始值
结束
结束
类Point3D(1,2,3)
Point3D
如果没有继承,如何访问
x
y
内部
?书上说:

它们有时看起来被继承的原因是实例变量是由首先给它们赋值的方法创建的,这些方法通常被继承或链接

但是我无法理解它的真正含义。

super(x,y)
调用基类的构造函数,这就是initialize方法。
如果将
super(x,y)
取出,则变量
@x
@y
将不会出现在派生类中。

它的措词很混乱@x、 @y和@z都是该Point3D实例上的实例变量。如果super(x,y)不在那里,Point3D实例就不会有@x或@y。

你是对的,这本书是错的,或者至少措辞不好
我认为这本书完全是错的,或者充其量,它给出了一个相当模糊的解释

在所有OO语言中,超类和派生类没有单独的对象。创建派生类的实例时,它也是超类的实例。有一个对象,它同时是两个类

因为只有一个对象,所以只有一组实例变量

这与所有其他OO系统相同。书中关于运行哪种方法以及方法本身是如何被真正继承的这一奇怪论点并没有增加多少清晰度


这个术语的问题是,当然,在动态类型系统中,首先没有声明,因此子类的定义肯定不会继承任何字段声明。。。因为当然没有。但是,仅仅因为没有要继承的类型,并不意味着相反的语句(“实例变量未被继承”)更为正确,而且这也增加了相当多的混淆,因为这意味着父对象将以某种方式拥有不同的实例变量,这是试图以他们的方式谈论对象的荒谬结果。

你可以比较这两个例子

例1:B似乎从A继承了
@i

class A
  def initialize()
    @i = "ok"
  end
end

class B < A
  def print_i()
    p(@i)
  end
end

B.new().print_i()   # Shows "ok"
在示例1中,类B的
@i
实际上是由调用
B.new()
时的
A#initialize()
隐式创建的


在您的例子中,
Point3D
中的
@x
@y
实际上是由
Point#initialize()
创建的,不是从
Point

继承的。谢谢。我做了一些测试并得出以下结论:如果调用父类构造函数并定义实例变量,派生类可以访问这些变量,并且可以通过派生类或父类进行更改。这就是我现在所了解的,我可能会有更大的了解和更多的经验。正如您所说,在子类中重写构造函数(初始化)的情况下,父类构造函数(initialize)中的实例变量将不可用,因为创建子类对象时不会执行父类构造函数(它有自己的initialize方法)。现在是案例2,当我们不重写initialize方法时,在本例中执行父类构造函数并创建新的子对象。这使得父类initialize方法中的所有实例变量都可用于子类对象及其方法。当然,但OP的问题更多地是关于OO的性质以及他对阅读的混乱文本的反应。啊,小心点。“点3D实例”也是“点”实例”,如果
super(x,y)
“不存在”,那么
也不会有
@x
@y
class A
  def initialize()
    @i = "ok"
  end
end

class B < A
  def initialize()
  end

  def print_i()
    p(@i)
  end
end

B.new().print_i()   # nil, print nothing