Ruby-Klasseninstanzvariablen und Vererbung

Habe ich eine Ruby-Klasse mit dem Namen LibraryItem. Ich will assoziieren mit jeder Instanz dieser Klasse ein array von Parametern. Dieses array ist lang und sieht so ähnlich aus wie

['title', 'authors', 'location', ...]

Beachten Sie, dass diese Attribute sind nicht wirklich soll, werden Methoden, einfach nur eine Liste von Attributen, die eine LibraryItem hat.

Als Nächstes möchte ich eine Unterklasse von LibraryItem genannt LibraryBook , hat eine Reihe von Attributen, die alle Attribute von LibraryItem aber auch viele, viele mehr.

Irgendwann möchte ich mehrere Unterklassen von LibraryItem jede mit Ihrer eigenen version der array @attributes aber indem jede an LibraryItem's @attributes (z.B.LibraryBook, LibraryDVD, LibraryMap usw.).

So, hier ist mein Versuch:

class LibraryItem < Object
  class << self; attr_accessor :attributes; end
  @attributes = ['title', 'authors', 'location',]
end

class LibraryBook < LibraryItem
  @attributes.push('ISBN', 'pages')
end

Funktioniert das nicht. Ich bekomme die Fehlermeldung

undefined method `push' for nil:NilClass

Wenn es Arbeit wäre, würde ich wollen, so etwas wie dieses

puts LibraryItem.attributes 
puts LibraryBook.attributes

Ausgabe

['title', 'authors', 'location']
['title', 'authors', 'location', 'ISBN', 'pages']

(Hinzugefügt Am 02-May-2010)
Eine Lösung ist, um @attributes eine einfache Instanz-variable und fügen Sie die neuen Attribute für LibraryBoot im initialize - Methode (dies wurde vorgeschlagen von demas in einer der Antworten).

Während dies würde sicherlich funktionieren (und ist, in der Tat, was habe ich bisher gemacht), ich bin nicht glücklich mit diesem, wie es sub-optimal ist: warum sollte diese unveränderlichen arrays konstruiert werden jedes mal, wenn ein Objekt erstellt wird?

Was ich wirklich will, ist eine Klasse von Variablen, die Erben können von einer übergeordneten Klasse, aber wenn geändert, in der Kind-Klasse nicht ändern, die der übergeordneten Klasse.

InformationsquelleAutor der Frage rlandster | 2010-05-02

Schreibe einen Kommentar