有人可以解释一个类可以如何访问其超类的实例变量,以及如何不继承? 我说的是“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
访问x
和y
内to_s
,如果他们不继承? 书上说的:
“他们有时似乎是遗传的原因是,实例变量是由第一个值分配给它们的方法创建,这些方法往往是继承或链接。”
但我无法弄清楚它的真正含义。
你是对的,这本书是错误的,或者至少措辞不当
我认为这本书是完全错误的,或者在最好的,它使一个相当泥泞的解释。
在所有面向对象的语言,超和派生类中没有单独的对象。 当你创建的派生类的一个实例,它也是父类的实例。 有一个对象,它是两个班一次。
由于只有一个对象,只有一组实例变量。
这是相同的所有其他OO系统。 怪异的说法,本书使这件事是多么重要的是运行的方法,以及如何这些方法本身是真正继承什么不会增加太多的清晰途径。
用术语的问题是,肯定的是,在动态类型系统存在摆在首位没有声明,所以肯定子类的定义并没有继承任何字段声明...因为,当然不会有任何。 但是,仅仅因为没有类型继承不作相反的声明(“实例变量是不可继承”)的任何更真实,并增加了相当多的混乱,因为它意味着某种程度上的父母将有不同的实例变量,这是试图谈论的对象,他们的方式做无意义的结果。
super(x,y)
调用基类,这是初始化方法的构造。 如果采取super(x,y)
的,则变量@x
和@y
将不会出现在派生类中。
它混淆的措辞。 @x,@y和@z是对三维点实例的所有实例变量。 如果超(X,Y)是不存在,该Point3D实例都不会有@x或@y。
你可以比较一下这两个例子。
例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
和@y
在Point3D
实际上是由创建Point#initialize()
而不是从继承Point