Подтвердить что ты не робот

Наследование переменных экземпляра

Может кто-нибудь объяснить, как класс может получить доступ к переменным экземпляра своего суперкласса и как это не наследование? Я говорю о "языке программирования 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, если они не наследуются? В книге говорится:

"Причина, по которой они иногда кажутся унаследованными, заключается в том, что переменные экземпляра создаются методами, которые сначала присваивают им значения, и эти методы часто унаследованы или скованы".

но я не могу понять, что это на самом деле означает.

4b9b3361

Ответ 1

Вы правы, книга неверна или, по крайней мере, плохо сформулирована


Я бы сказал, что книга просто неверна, или, в лучшем случае, она делает довольно грязное объяснение.

На всех языках OO суперкласс и производный класс не имеют отдельных объектов. Когда вы создаете экземпляр производного класса, он также является экземпляром суперкласса. Существует один объект, и это одновременно оба класса.

Поскольку существует только один объект, существует только один набор переменных экземпляра.

Это то же самое, что и все другие OO-системы. Странный аргумент, который делает книга о том, как это просто важно, какой метод запущен и как сами методы являются тем, что действительно унаследовано, мало чем отличается от ясности.

Проблема с терминологией заключается в том, что, конечно, в динамически типизированной системе нет объявления в первую очередь, и поэтому, конечно, определение подкласса не наследует никаких объявлений полей... потому что, конечно, Нет. Но только потому, что нет типов для наследования, не делает противоположный оператор ( "переменные экземпляра не наследуются" ) более достоверен, и он добавляет довольно немного путаницы, поскольку подразумевает, что каким-то образом у родителя будут разные переменные экземпляра, что является бессмысленным результатом попытки говорить об объектах так, как они это делают.

Ответ 2

super(x,y) вызывает конструктор базового класса, который является методом инициализации. Если вы выберете super(x,y) out, переменные @x и @y не будут отображаться в производном классе.

Ответ 3

Это смутно сформулировано. @x, @y и @z - все переменные экземпляра на этом экземпляре Point3D. Если этого супер (x, y) не было, экземпляр Point3D не имел бы @x или @y.