我有一個包裝其他實例以提供附加功能(演示者)並希望現在具有提供相同功能的子類的類。因此,這將是這樣的: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