Je l'ai fait aujourd'hui.Traduit en véhicules, il ressemblerait à ceci:
class Vehicle
VEHICLES = {}
def self.register_vehicle name
VEHICLES[name] = self
end
def self.vehicle_from_name name
VEHICLES[name].new
end
end
class Bike < Vehicle
register_vehicle 'mountain bike'
end
class Car < Vehicle
register_vehicle 'ferrari'
end
J'aime que les étiquettes pour les classes sont conservés avec les classes elles-mêmes, au lieu d'avoir des informations sur une sous-classe stockée avec la superclasse. Le constructeur n'est pas appelé new
, mais je ne vois aucun avantage à utiliser ce nom particulier, et cela rendrait les choses plus délicates.
> Vehicle.vehicle_from_name 'ferrari'
=> #<Car:0x7f5780840448>
> Vehicle.vehicle_from_name 'mountain bike'
=> #<Bike:0x7f5780839198>
Notez que quelque chose doit faire en sorte que ces sous-classes sont chargées avant vehicle_from_name est exécuté (probablement ces trois classes seraient dans différents fichiers source), sinon la superclasse aura aucun moyen de savoir ce que les sous-classes existe, c'est-à-dire que vous ne pouvez pas compter sur autoload pour extraire ces classes lors de l'exécution du constructeur. J'ai résolu ce problème en mettant toutes les sous-classes, par exemple, dans le sous-groupe de la sous-classe. un sous-répertoire vehicles
et en ajoutant à la fin de vehicle.rb
:
require 'require_all'
require_rel 'vehicles'
Utilise la gemme require_all
(trouvé à https://rubygems.org/gems/require_all et https://github.com/jarmo/require_all)
Pouvez-vous utiliser mixins? Qu'est-ce que je veux dire, est-ce que vous devez avoir des classes pour Bike and Car? Pourriez-vous avoir un mixin Bike and Car qui pourrait être inclus ou étendu dans l'objet créé dans le constructeur. –
Hmm, je suppose qu'en principe - bien que ce soit plus un hack - le concept OO correct est que l'objet résultant 'est un' vélo ou une voiture, pas 'se comporte comme' un vélo ou une voiture. – Peter
Comment votre code sait quel type d'objet est requis? Est-ce qu'une sorte de table de consultation est impliquée? –