Problème de conception (Design pattern ?) : création d'objets polymorphes
Bonjour,
Je cherche à redévelopper une partie de mon code proprement qui ressemble plus ou moins à ça :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class MA
{
...
protected MB b;
public MA(Param TheParam)
{
...
if (Cond1Exécution(TheParam))
b = new FB1;
else if (Cond2Exécution(TheParam))
b = new FB2;
...
}
...
}
class FA1 : MA
{
private FB1 b1;
...
}
class FA2 : MA
{
private FB2 b2;
...
}
*****
foreach(truc in trucs)
{
MA a = new MA(truc);
if (a.b is FB1)
{
FA1 a1 = new FA1(truc);
collection1.add(a1);
}
...
} |
Mon besoin est donc de créer des objets composés dont le type est connu qu'à l'exécution.
Concernant l'utilisation de mes classes, je sais que j'aurais du utiliser l'instruction using (et implémenter Dispose()) et faire une copie plutôt que de reconstruire entièrement mon objet dérivé. Mais je pense que la conception elle-même est mauvaise et que j'aurais du employer un design pattern de construction.
J'aurai donc besoin d'aide, svp, pour savoir lequel et comment l'implémenter.
AUtre solution : la Reflexion
Bonjour,
une autre solution - très souple - consiste à utiliser la Reflexion et les informations run-time.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
using System.Reflection;
class MyClass
{
public Object Create(Type target)
{
object o;
o = target.GetConstructor(Type.EmptyTypes).Invoke(new object[] { });
return o;
}
} |
La méthode Create attend un Type dont le constructeur par défaut va être identifié l'exécution.
Il faut juste penser à caster l'objet retourné avec le on type.