【发布时间】:2012-11-14 05:56:31
【问题描述】:
我正在创建一个支持 API 网络的库。该库的中心当前是每个 API 客户端子类的客户端类。由于我是编写所有 API 的人,因此它们的功能都类似(restful、通过 access_token 进行授权等)。
但是,与其他 ruby API 客户端库(Twitter's 等)不同,客户端类不应直接实例化。这是因为该库不限于单个 API。相反,每个 API 客户端都将继承 Client 类。我的问题如下:
有没有办法要求 Ruby 类只通过子类初始化?
此外,在阅读this question 时,我认为类比混合更好。
对于那些想要代码的人,这里有一个例子:
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#initialize不会被直接调用,除非你调用A.new。它有什么问题? -
问题是理论上有人仍然可以调用 A#initialize
-
initialize是一个私有方法。你不能用接收器来调用它。
标签: ruby