0

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

更新答案:

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

4

2 回答 2

1

如果您想从类外部调用私有(或受保护)方法,可以使用send. 所以在你的工厂里你可以有这样的东西:

instance = ClassA.send(:create)
于 2013-05-10T00:49:43.820 回答
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...*)

可以找到此解决方案的功劳:这里

于 2013-05-10T01:18:38.587 回答