Ruby继承和建议的方法?

时间:2013-03-27 15:37:06

标签: ruby

我想要的是一个单独的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的属性的对象。有没有更好的方法来解决这个问题?

2 个答案:

答案 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