实例变量继承(Instance Variables Inheritance)

2019-08-02 20:15发布

有人可以解释一个类可以如何访问其超类的实例变量,以及如何不继承? 我说的是“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)"

如何类Point3D访问xyto_s ,如果他们不继承? 书上说的:

“他们有时似乎是遗传的原因是,实例变量是由第一个值分配给它们的方法创建,这些方法往往是继承或链接。”

但我无法弄清楚它的真正含义。

Answer 1:

你是对的,这本书是错误的,或者至少措辞不当


我认为这本书是完全错误的,或者在最好的,它使一个相当泥泞的解释。

在所有面向对象的语言,超和派生类中没有单独的对象。 当你创建的派生类的一个实例,它也是父类的实例。 有一个对象,它是两个班一次。

由于只有一个对象,只有一组实例变量。

这是相同的所有其他OO系统。 怪异的说法,本书使这件事是多么重要的是运行的方法,以及如何这些方法本身是真正继承什么不会增加太多的清晰途径。

用术语的问题是,肯定的是,在动态类型系统存在摆在首位没有声明,所以肯定子类的定义并没有继承任何字段声明...因为,当然不会有任何。 但是,仅仅因为没有类型继承不作相反的声明(“实例变量是不可继承”)的任何更真实,并增加了相当多的混乱,因为它意味着某种程度上的父母将有不同的实例变量,这是试图谈论的对象,他们的方式做无意义的结果。



Answer 2:

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



Answer 3:

它混淆的措辞。 @x,@y和@z是对三维点实例的所有实例变量。 如果超(X,Y)是不存在,该Point3D实例都不会有@x或@y。



Answer 4:

你可以比较一下这两个例子。

例1:看来乙继承@i从A.

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

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

B.new().print_i()   # Shows "ok"

例2:如果B有它自己的initialize()它不能找到@i

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

class B@i实施例1中,实际上是由隐式创建A#initialize()在调用B.new()

在你的情况, @x@yPoint3D实际上是由创建Point#initialize()而不是从继承Point



文章来源: Instance Variables Inheritance