Tengo una clase de Ruby llamada LibraryItem
. Quiero asociar con cada instancia de esta clase una matriz de atributos. Esta matriz es largo y se ve algo comoVariables de instancia de la clase Ruby y herencia
['title', 'authors', 'location', ...]
Tenga en cuenta que estos atributos no se supone realmente ser métodos, sólo una lista de atributos que un LibraryItem
tiene.
A continuación, quiero hacer una subclase de LibraryItem
llama LibraryBook
que tiene una serie de atributos que incluye todos los atributos de LibraryItem
pero también incluirá muchos más.
Eventualmente querrá varias subclases de LibraryItem
cada uno con su propia versión de la matriz @attributes
pero cada uno la adición a LibraryItem
's @attributes
(por ejemplo, LibraryBook
, LibraryDVD
, LibraryMap
, etc.).
Por lo tanto, aquí está mi intento:
class LibraryItem < Object
class << self; attr_accessor :attributes; end
@attributes = ['title', 'authors', 'location',]
end
class LibraryBook < LibraryItem
@attributes.push('ISBN', 'pages')
end
Esto no funciona. Me sale el error
undefined method `push' for nil:NilClass
Si fuera a trabajar, me gustaría que algo como esto
puts LibraryItem.attributes
puts LibraryBook.attributes
a la salida
['title', 'authors', 'location']
['title', 'authors', 'location', 'ISBN', 'pages']
(Añadido: 02-May-2010) Una de las soluciones para esto es para hacer @attributes
una variable de instancia simple y luego agregar los nuevos atributos para LibraryBoot
en el método initialize
(esto fue sugerido por demas en uno o f las respuestas).
Si bien esto ciertamente funcionaría (y es, de hecho, lo que he estado haciendo todo el tiempo), no estoy contento con esto ya que es subóptimo: ¿por qué deberían construirse estas matrices invariables cada vez que un objeto es ¿creado?
Lo que realmente quiero es tener variables de clase que puedan heredar de una clase principal, pero cuando cambien en la clase secundaria no cambien en la clase principal.
Esto no es lo Yo quiero. Quiero que la variable de instancia de clase para LibraryItem contenga solo ['título', 'autores', 'ubicación',], mientras que la misma variable de instancia para LibraryBook contenga ['título', 'autores', 'ubicación',] más [ 'ISBN', 'páginas']. Editaré la pregunta para aclarar esto. – rlandster
Esto tiene errores de sintaxis. Además, los atributos * del atributo de clase de clase * ni siquiera están conectados a la constante * ATTRIBUTES * de todos modos. –