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