У меня есть класс 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']
(добавлено 2 мая 2010 г.)
Одним из решений этого является создание @attributes
простой переменной экземпляра, а затем добавление новых атрибутов для LibraryBoot
в методе initialize
(это было предложено demas в одном из ответов).
Хотя это, безусловно, сработает (и на самом деле это то, чем я занимался все время), я не доволен этим, поскольку он неоптимален: почему эти неизменяемые массивы должны создаваться при каждом создании объекта
Что я действительно хочу, так это иметь переменные класса, которые могут наследоваться от родительского класса, но при изменении в дочернем классе не изменяются в родительском классе.