我有一个名为LibraryItem
. 我想与这个类的每个实例关联一个属性数组。这个数组很长,看起来像
['title', 'authors', 'location', ...]
请注意,这些属性实际上并不应该是方法,而只是 a 具有的属性列表LibraryItem
。
接下来,我想创建一个LibraryItem
被调用的子类,LibraryBook
它有一个属性数组,其中包括所有属性,LibraryItem
但还会包括更多属性。
最终我会想要几个子类,LibraryItem
每个子类都有自己的数组版本,@attributes
但每个子类都添加到LibraryItem
's @attributes
(例如,、、、LibraryBook
等LibraryDVD
)LibraryMap
。
所以,这是我的尝试:
class LibraryItem < Object
class << self; attr_accessor :attributes; end
@attributes = ['title', 'authors', 'location',]
end
class LibraryBook < LibraryItem
@attributes.push('ISBN', 'pages')
end
这不起作用。我得到错误
undefined method `push' for nil:NilClass
如果它起作用,我想要这样的东西
puts LibraryItem.attributes
puts LibraryBook.attributes
输出
['title', 'authors', 'location']
['title', 'authors', 'location', 'ISBN', 'pages']
(添加于 2010 年 5 月 2 日)对此的一种解决方案是创建@attributes
一个简单的实例变量,然后LibraryBoot
在initialize
方法中添加新属性(这是 demas 在其中一个答案中提出的建议)。
虽然这肯定会奏效(事实上,这也是我一直在做的事情),但我对此并不满意,因为它不是最理想的:为什么每次创建对象时都要构造这些不变的数组?
我真正想要的是拥有可以从父类继承但在子类中更改时不会在父类中更改的类变量。