我有一个包装其他实例以提供附加功能(演示者)并希望现在具有提供相同功能的子类的类。因此,这将是这样的:Ruby包装函数
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 >
我希望创建一个相当于'阵列()'。该功能将不会与'Class#new'完全相同@ – Chris
@Chris,从您的问题看,它的功能* *是相同的。请编辑您的问题并显示完全不同的内容。如果唯一的一点是摆脱'新',我会建议忘掉它。这是不值得的努力。 – Mischa
好的,我更新了这个问题。我并没有试图摆脱'.new',而是在ArraySuite中包含Array()或Array#wrap()。 – Chris