我有一个包装其他实例以提供附加功能(演示者)的类,并且现在希望拥有提供相同功能的子类。所以它会是这样的:
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 >