Я хотел бы создать абстрактный класс, который будет создавать конкретные экземпляры в зависимости от параметра инициализации.Пример:
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
obj = SomethingGeneric.new("foo", arg)
, я получу экземпляр FooSomething.
Моя проблема здесь заключается в «новом» методе.Я определил SomethingGeneric.new, однако FooSomething и BarSomething являются подклассами SomethingGeneric, поэтому они наследуют «новый» метод, который вызывается здесь с неверными аргументами:
obj = a_class.new(arg)
Одним из решений будет использование другого именидля заводского метода «новый».Однако я хотел бы придерживаться удобства и оставить метод фабрики абстрактных суперклассов под названием 'new'.
Какой самый чистый и правильный способ решения этой проблемы?