と呼ばれるRubyクラスがありLibraryItem
ます。このクラスのすべてのインスタンスに属性の配列を関連付けたいと思います。この配列は長く、次のようになります
['title', 'authors', 'location', ...]
これらの属性は実際にはメソッドであるとは想定されておらず、aが持つ属性のリストにすぎないことに注意してくださいLibraryItem
。
次に、のすべての属性を含むが、さらに多くの属性を含む属性の配列を持つ、 LibraryItem
calledのサブクラスを作成したいと思います。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']
(2010年5月2日追加)これに対する1つの解決策は@attributes
、単純なインスタンス変数を作成しLibraryBoot
てから、initialize
メソッドにの新しい属性を追加することです(これは、回答の1つでdemasによって提案されました)。
これは確かに機能しますが(実際、私がずっとやってきたことです)、これは最適ではないため、満足していません。オブジェクトが作成されるたびに、これらの不変の配列を作成する必要があるのはなぜですか。
私が本当に望んでいるのは、親クラスから継承できるクラス変数を用意することですが、子クラスで変更しても、親クラスでは変更されません。