J'ai une classe Ruby appelée LibraryItem
. Je veux associer à chaque instance de cette classe un tableau d'attributs. Ce tableau est long et ressemble à quelque chose commeVariables d'instance de classe Ruby et héritage
['title', 'authors', 'location', ...]
Notez que ces attributs ne sont pas vraiment censés être des méthodes, juste une liste d'attributs qu'un LibraryItem
a.
Ensuite, je veux faire une sous-classe de LibraryItem
appelé LibraryBook
qui a un tableau d'attributs qui inclut tous les attributs de LibraryItem
mais comprendra également beaucoup d'autres.
Finalement je voudrai plusieurs sous-classes de LibraryItem
chacun avec leur propre version du tableau @attributes
mais chacun ajoutant à l » @attributes
LibraryItem
(par exemple, LibraryBook
, LibraryDVD
, LibraryMap
, etc.).
Alors, voici ma tentative:
class LibraryItem < Object
class << self; attr_accessor :attributes; end
@attributes = ['title', 'authors', 'location',]
end
class LibraryBook < LibraryItem
@attributes.push('ISBN', 'pages')
end
Cela ne fonctionne pas. Je reçois l'erreur
undefined method `push' for nil:NilClass
Si elle devait travailler, je veux quelque chose comme ça
puts LibraryItem.attributes
puts LibraryBook.attributes
à la sortie
['title', 'authors', 'location']
['title', 'authors', 'location', 'ISBN', 'pages']
(Ajouté 02-mai-2010) Une solution Pour cela, @attributes
doit être une variable d'instance simple, puis ajouter les nouveaux attributs pour LibraryBoot
dans la méthode initialize
(cela a été suggéré par demas dans un o f les réponses). Bien que cela fonctionne certainement (et est, en fait, ce que j'ai fait depuis le début), je ne suis pas satisfait de cela car il est sous-optimal: pourquoi ces tableaux immuables devraient être construits chaque fois qu'un objet est créé? Ce que je veux vraiment, c'est avoir des variables de classe qui peuvent hériter d'une classe parente mais qui ne changent pas dans la classe parent quand elles sont changées dans la classe enfant.
Ce n'est pas ce Je veux. Je veux que la variable d'instance de classe pour LibraryItem contienne uniquement ['title', 'authors', 'emplacement'] alors que la même variable d'instance pour LibraryBook contienne ['title', 'authors', 'location',] plus [ 'ISBN', 'pages']. Je vais éditer la question pour la rendre plus claire. – rlandster
Ceci a des erreurs de syntaxe. De plus, l'attribut d'objet de classe * attributes * n'est même pas connecté à la constante * ATTRIBUTES *. –