他のインスタンスをラップして追加機能 (プレゼンター) を提供するクラスがあり、同じ機能を提供するサブクラスを作成したいと考えています。したがって、次のようになります。
class BasePresenter
attr_accessor :base_object
def initialize(base_object)
self.base_object = base_object
end
end
class WalrusPresenter < BasePresenter
end
そして、私はこれを行うことができるようにしたい:
BasePresenter(:bubbles)
#=> <# BasePresenter @base_object=:bubbles >
WalrusPresenter(:frank)
#=> <# WalrusPresenter @base_object=:frank >
アップデート
機能の違いは質問の範囲外だと思いますが、難点のようですので追加します。
私は委任しようとしていません.new
。
BasePresenter.new
単一の引数を取り、それをプレゼンターにラップします。BasePresenter()
オブジェクトを取り、次のことを行います。
- すでにプレゼンターの場合は、それを返します
- オブジェクトの配列の場合は、それらをマッピングして新しいプレゼンターを作成します
- 単一のオブジェクトの場合は、プレゼンターでラップして返します。
これは ActiveSupport のArray#wrap
に近いですが、括弧内の構文はその機能を伝えるのに適していると思うので、可能であればそれを使用したいと思います。継承部分は私をつまずかせているものです。すべての子で使用できるように、基本クラスで一度定義します。
BasePresenter(:bubbles)
#=> <# BasePresenter @base_object=:bubbles >
BasePresenter([:waldorf, :statler])
#=> [ <# BasePresenter @base_object=:waldorf >, <# BasePresenter @base_object=:staler> ]
WalrusPresenter.new(:frank)
#=> <# WalrusPresenter @base_object=:frank >
WalrusPresenter([:harold, :richard])
#=> [ <# WalrusPresenter @base_object=:harold >, <# WalrusPresenter @base_object=:richard > ]
WalrusPresenter(WalrusPresenter(WalrusPresenter(:frank)))
#=> <# WalrusPresenter @base_object=:frank >