suppose que j'ai TModel:usine générique
TModelClass = class of TModel;
TModel = class
procedure DoSomeStuff;
end;
et 2 descendants:
TModel_A = class(TModel);
TModel_B = class(TModel);
et une usine:
TModelFactory = class
class function CreateModel_A: TModel_A;
class function CreateModel_B: TModel_B;
end;
Maintenant, je veux factoriser un peu:
TModelFactory = class
class function CreateGenericModel(Model: TModelClass) : TModel
end;
class function TModelFactory.CreateGenericModel(Model: TModelClass) : TModel
begin
...
case Model of
TModel_A: Result := TModel_A.Create;
TModel_B: Result := TModel_B.Create;
end;
...
end;
Jusqu'ici tout va bien, mais chaque fois que je crée un descendant TModel
, je dois modifier l'instruction d'usine case
.
Ma question: Est-ce possible de créer une usine générique 100% pour tous mes TModel
descendants, donc chaque fois que je crée un TModel
descendants Je n'ai pas modifier TModelFactory
?
J'ai essayé de jouer avec Delphi 2009 génériques, mais n'a pas trouvé de précieuses informations, tous sont liés à l'utilisation de base de TList<T>
et ainsi de suite.
Mise à jour Désolé, mais peut-être que je ne suis pas clair ou ne comprends pas votre réponse (je suis encore un noob), mais ce que je suis en train de réaliser est:
var
M: TModel_A;
begin
M: TModelFactory.CreateGenericModel(MY_CONCRETE_CLASS);
Salut Malcolm, merci pour votre réponse.J'ai essayé de mettre en œuvre votre solution très élégante mais j'ai rencontré une fuite de mémoire. J'ai mis un commentaire sur le post de votre blog – Fred
Merci Fred, Oui, c'était une erreur dans le test TestGetInstance, pas dans l'Usine elle-même. J'ai corrigé le téléchargement, donc vous devriez être bien maintenant. –
Merci Malcolm pour votre mise à jour. – Fred