我想创建一个抽象类,它将根据初始化参数创建具体实例。例子:
class SomethingGeneric
def self.new(type, arg)
class_name = "#{type.capitalize}Something"
if obj.const_defined?(class_name)
a_class = obj.const_get(class_name)
else
raise ArgumentError, "Concrete something '#{type}' was not found"
end
obj = a_class.new(arg)
return obj
end
end # class
然后我想要 FooSomething <SomethingGeneric、BarSomething <SomethingGeneric 等等。然后当我这样做时:
obj = SomethingGeneric.new("foo", arg)
我会得到 FooSomething 实例。
我的问题是“新”方法。我已经定义了SomethingGeneric.new,但是FooSomething 和BarSomething 是SomethingGeneric 的子类,因此它们继承了“新”方法,该方法在这里用错误的参数调用:
obj = a_class.new(arg)
解决方案之一是为工厂方法“new”使用另一个名称。但是,我想坚持方便并保留名为“new”的抽象超类工厂方法。
解决这个问题的最干净的正确方法是什么?