У меня есть класс Ruby под названием LibraryItem
. Я хочу связать с каждым экземпляром этого класса массив атрибутов. Этот массив длинный и выглядит примерно как
['title', 'authors', 'location', ...]
Обратите внимание, что эти атрибуты на самом деле не должны быть методами, просто список атрибутов, которые имеет LibraryItem
.
Затем я хочу создать подкласс LibraryItem
под названием LibraryBook
, который имеет массив атрибутов, который включает в себя все атрибуты LibraryItem
, но также будет включать в себя еще много.
В конце концов мне понадобится несколько подклассов LibraryItem
, каждая из которых имеет собственную версию массива @attributes
, но каждый добавляет к LibraryItem
@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']
(Добавлено 02 мая 2010 г.)
Одно из решений заключается в том, чтобы сделать @attributes
простой экземпляр переменной, а затем добавить новые атрибуты для LibraryBoot
в методе initialize
(это было предложено демавами в одном из ответов).
Хотя это, безусловно, будет работать (и, фактически, то, что я делаю все это время), я не доволен этим, поскольку он не оптимален: почему эти неизменные массивы должны быть построены каждый раз, когда объект создается
Я действительно хочу иметь переменные класса, которые могут наследоваться от родительского класса, но при изменении в дочернем классе не изменяются в родительском классе.