想要使用工厂中的私有构造函数来实例化ruby类

时间:2013-05-10 00:42:23

标签: ruby metaprogramming

我习惯了c#/ .net,所以我来自一个类型安全的背景。我正在使用Ruby。我想创建一个类(ClassA),它有一个私有(如果我需要,我会解决受保护的)构造函数。原因是,我想创建一个Factory(FactoryModule :: create)来控制所有ClassA对象的实例化。我意识到这在Ruby中并不是万无一失(但是),但至少代码将是自我记录的,因为基于代码和测试,显然必须通过FactoryModule :: create方法实例化ClassA。在ModuleFactory :: create方法中,我尝试将ClassA构造函数的可见性更改为public,实例化对象,然后将可见性更改回私有,但A)我收到错误,B)它是草率的而不是线程安全的。有什么想法吗?

更新答案:

https://gist.github.com/gangelo/5551902

2 个答案:

答案 0 :(得分:1)

如果您想从课堂外调用私人(或受保护)方法,可以使用send。所以在你的工厂你可能会有类似的东西:

instance = ClassA.send(:create)

答案 1 :(得分:0)

更新:回答

在我的课程中包含此模块,可以防止Klass.new被调用:

module ProtectedConstructor
  def self.included(klass)
    klass.module_eval do
      class << self
        protected :new

        def inherited(klass)
          klass.module_eval do
            def self.new(*args); super; end
          end
        end
      end
    end
  end
end

通过受保护的构造函数实例化Klass,如下所示:

Klass.send(:new, *params...*)

可以找到此解决方案的信用:here