Je voudrais créer une classe abstraite qui créera des instances concrètes en fonction du paramètre d'initialisation. Exemple:Comment créer un "cluster de classe" (classe de fabrique avec des instances de sous-classes concrètes) dans Ruby?
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
Je voudrais avoir FooSomething < SomethingGeneric, BarSomething < SomethingGeneric et plus encore. Puis quand je fais:
obj = SomethingGeneric.new("foo", arg)
Je voudrais obtenir FooSomething instance.
Mon problème ici est la "nouvelle" méthode. Je l'ai défini SomethingGeneric.new, mais FooSomething et BarSomething sont sous-classes de SomethingGeneric donc ils héritent de la « nouvelle » méthode qui est appelée avec des arguments faux ici:
obj = a_class.new(arg)
Une des solutions serait d'utiliser un autre nom pour la méthode d'usine "nouveau". Cependant, je voudrais rester avec commodité et garder la méthode abstraite usine de superclasse nommée «nouveau».
Quelle est la manière la plus propre de résoudre ce problème?
Pourquoi? Oh mon Dieu! Pourquoi? – Ariejan
@Ariejan pourquoi pas? –