我正在創建一個支持API網絡的庫。該庫的中心目前是每個API客戶端子類的Client類。由於我是編寫我所有API的人,所以他們都會以類似的方式運行(通過access_token等進行安寧的授權)。有沒有辦法將Ruby類初始化僅限制到一個子類?
不像其他ruby API客戶端庫(Twitter's等),不應該直接實例化客戶端類。這是因爲該庫不限於單個API。相反,每個API客戶端都將繼承客戶端類。我的問題如下:
有沒有辦法要求Ruby類只通過子類初始化?
此外,在閱讀this question我決定在這裏一個班級比mixin更好。
對於那些想代碼,這裏有一個例子:
class A
def initialize(options = {})
#what goes on in here doesn't really matter for the purpose of this question
#I just don't want it to be initialized directly
options.each do |k,v|
instance_variable_set("@#{k}",v) unless v.nil?
end
end
end
class B < A
attr_accessor :class_specific_opt
def initialize(options = {})
@class_specific_opt = "val" unless options[:class_specific_opt].nil?
super(options)
end
end
有什麼想法?
如果你做'B.new',那麼將調用'B#initialize',它將調用'A#initialize'。 '#初始化'不會被直接調用,除非你做'A.new'。它有什麼問題? – sawa
問題是,有人仍然可以理論上調用A#初始化 –
'initialize'是一種私有方法。你不能用接收器調用它。 – sawa