有人可以解释一个类如何访问其超类的实例变量,以及如何不继承?我在说“
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,3)"
如果Point3D类不能继承,那么在to_s中如何访问x和y?这本书说:
“The reason that they sometimes appear to be inherited is that instance variables are created by the methods that first assign values to them,and those methods are often inherited or chained.”
但我无法弄清楚它是什么意思.
解决方法
你是对的,这本书是错误的,或者说至少说得不好
我会认为这本书是错误的,或者说,这本书是一个很浑浊的解释.
在所有OO语言中,超类和派生类没有单独的对象.当您创建派生类的实例时,它也是超类的一个实例.有一个对象,它同时是两个类.
由于只有一个对象,只有一组实例变量.
这与所有其他OO系统相同.书中所说的关于如何运行哪种方法以及方法本身是真正继承的方法的奇怪论据在清晰度方面并没有增加太多.
这个术语的问题是,确实,在一个动态类型的系统中,首先没有声明,所以当然这个子类的定义不会继承任何字段声明,因为当然没有任何.但是只是因为没有类型继承不会使相反的语句(“实例变量不被继承”)更真实,并且它增加了相当多的混乱,因为它意味着父母会有不同的实例变量,这是试图以他们所做的方式谈论对象的荒谬结果.