我想要的是一个单独的API,它根据通过初始化程序传递的参数来确定委托方法的类。这是一个基本的例子:
module MyApp
class Uploader
def initialize(id)
# stuck here
# extend, etc. "include Uploader#{id}"
end
end
end
# elsewhere
module MyApp
class UploaderGoogle
def upload(file)
# provider-specific uploader
end
end
end
我想要的结果:
MyApp::Uploader('Google').upload(file)
# calls MyApp::UploaderGoogle.upload method
请注意以上内容仅供演示之用。我实际上将传递一个包含具有上传者ID的属性的对象。有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
听起来你想要一个简单的子类。 UploaderGoogle < Uploader
Uploader定义基本接口,然后子类定义提供者特定的方法,根据需要调用super来执行上载。未经测试的代码OTTOMH如下......
module MyApp
class Uploader
def initialize(id)
@id = id
end
def upload
#perform upload operation based on configuration of self. Destination, filename, whatever
end
end
class GoogleUploader < Uploader
def initialize(id)
super
#google-specific stuff
end
def upload
#final configuration/preparation
super
end
end
end
这些方面的东西。基于传递的参数,我将使用case
语句。
klass = case paramObject.identifierString
when 'Google'
MyApp::GoogleUploader
else
MyApp::Uploader
end
两件事:如果你在几个地方这样做,可能会把它提取到一个方法中。其次,如果您从用户那里获得了输入,那么如果您直接从提供的字符串创建类名,那么您还需要做很多反注入工作。
答案 1 :(得分:1)
尚未对其进行测试,但如果您想要include
模块:
module MyApp
class Uploader
def initialize(id)
mod = ("Uploader"+id).constantize
self.send(:include, mod)
end
end
end
如果您想使用模块扩展您的课程:
module MyApp
class Uploader
def initialize(id)
mod = ("Uploader"+id).constantize
self.class.send(:extend, mod)
end
end
end