Создайте новый экземпляр родительской переменной класса для каждого дочернего класса - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть родительский класс:

class ListBase
  @@list = []

  def self.list
    @@list
  end
end

Я пытаюсь создать два дочерних класса следующим образом:

class Child1 < ListBase
end

class Child2 < ListBase
end

У меня сложилось впечатление, что у каждого из этих дочерних классов будет собственная переменная класса @@list. Тем не менее, я получаю это:

Child1.list.push(1)
Child2.list.push(2)
Child1.list # => [1, 2]
Child2.list # => [1, 2]

, что означает, что дочерние классы разделяют @@list от родительского класса.

Как я могу создать отдельную переменную класса для каждого из дочерних классов без повторения?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Как комментарии @CarySwoveland, в вашем случае вы должны использовать переменную экземпляра класса:

class ListBase
  @list = []

  def self.list
    @list
  end
end

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

0 голосов
/ 09 ноября 2018

Вы используете переменную класса через метод класса (getter / reader).
Таким образом, вы можете переопределить этот метод в производных классах и использовать собственную переменную класса для каждого производного класса.
Не забавно, но то, как работают переменные класса, они разделяются внутри класса и производных классов.

class ListBase
  def self.list
    @@base_list ||= []
  end
end

class ListOne
  def self.list
    @@one_list ||= []
  end
end

class ListTwo
  def self.list
    @@two_list ||= []
  end
end

ListOne.list << 1
ListTwo.list << 2

puts ListOne.list
# => [1]
puts ListTwo.list
# => [2]
...