2013-05-10 50 views
0

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

更新答:

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

回答

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.send(:new, *params...*) 

此解决方案的信用可以发现:here

1

如果你想打电话从你的类外的私人(或保护)的方法,你可以使用send。因此,在您的工厂,你可以有这样的:

instance = ClassA.send(:create) 
+0

感谢兄弟,但我需要保护,最终,Klass.new。我确实使用它来调用帮助我的Klass.send(:new,params)。 – gangelo 2013-05-10 01:33:21

+0

对不起 - 我误解你的问题,指出你正在将'create'定义为私有,并将其用于实例化。 – theTRON 2013-05-10 02:04:18

+0

无后顾之忧;似乎最近在进行;也许我是“华而不实的屁股”。 – gangelo 2013-05-10 02:06:36

相关问题