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