0

我想要的是一个单一的 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 的属性。有没有更好的方法来处理这个?

4

2 回答 2

1

听起来你想要一个简单的子类。UploaderGoogle < UploaderUploader 定义了基本接口,然后子类定义了提供者特定的方法,根据需要调用 super 来执行上传。未经测试的代码 OTTOMH 下面...</p>

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

两件事:如果你在几个地方这样做,可能会将它提取到一个方法中。其次,如果您从用户那里获得输入,那么如果您直接从提供的字符串创建类名,那么您还有很多反注入工作要做。

于 2013-03-27T15:51:05.287 回答
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
于 2013-03-27T16:19:48.473 回答