为每个子类创建父类变量的新实例

时间:2018-11-09 04:35:55

标签: ruby inheritance class-variables class-instance-variables

我有这个家长班:

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 :(得分:1)

您正在通过类方法(获取器/读取器)使用类变量。
因此,您可以在派生类中重写该方法,并为每个派生类使用自己的类变量。
不好玩,但是类变量是如何工作的,它们在一个类和派生类中也是共享的。

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]

答案 1 :(得分:1)

作为@CarySwoveland注释,在您的用例中,您应该使用类实例变量:

class ListBase
  @list = []

  def self.list
    @list
  end
end

甚至不确定为什么要考虑在用例中使用类变量。