(Beaucoup édité) J'ai quelques classes avec des membres abstraits. Le type concret des membres abstraits doit être déterminé lors de l'instanciation de classe, en fonction de l'entrée de l'utilisateur. Cependant, le type concret du second membre peut dépendre du premier membre. J'essaye de faire quelque chose en gardant à l'esprit le modèle de conception MVP. J'ai enseigné comment faire en sorte que le Présentateur passe un délégué au Ctor du Modèle, qu'il utiliserait (le Ctor) pour demander les informations nécessaires à l'instanciation de la classe. Je ne suis pas sûr que ce soit une bonne idée. Voici ce que j'ai écrit:Utilisation du MVP pour un modèle d'objet structuré composite
// In the Model :
public class Model
{
public E Element1;
public E Element2;
public Model(CustomCtor<ModelElement, IModelElement> GetModelElement)
{
this.Element1 = (E)GetModelElement(ModelElement.E, null);
this.Element2 = (E)GetModelElement(ModelElement.E, null);
//Element2 does not depend on Element1 in this case though.
}
}
public abstract class E : IModelElement { }
public class EA : E
{
public string Element1;
public EA(string Element1) { this.Element1 = Element1; }
}
public class EB : E
{
public int Element1;
public EB(int Element1) { this.Element1 = Element1; }
}
public interface IModelElement { }
public enum ModelElement { E, EA, EB }
// In the Presenter :
public class Presenter
{
View.View view1;
public Presenter() { }
public void SetView(View.View view) { this.view1 = view; }
public Model.Model MakeModel()
{
CustomCtor<ModelElement, IModelElement> GetModelElement = new CustomCtor<ModelElement, IModelElement>(GetModelElement<ModelElement, IModelElement>);
return new Model.Model(GetModelElement);
}
private Model.IModelElement GetModelElement<ModelElement, Tout>(Model.ModelElement ME, object obj)
{
switch (ME)
{
case Model.ModelElement.E:
return MakeE();
// One case per Model.ModelElement
default:
throw new Exception("ModelElement not implemented in the Presenter.");
}
return default(Model.IModelElement);
}
private E MakeE()
{
switch (view1.AskEType())
{
case 1:
return MakeEA();
case 2:
return MakeEB();
default:
throw new Exception();
}
}
private EA MakeEA() { return new EA(view1.AskString("EA.Element1 (String)")); }
private EB MakeEB() { return new EB(view1.AskInt("EB.Element1 (Int)")); }
}
// Shared to the Model and the Presenter :
public delegate TOut CustomCtor<EnumType, TOut>(EnumType Enum, object Params) where EnumType : struct;
// In the View :
public class View
{
public int AskEType()
{
Console.WriteLine(string.Format("Type of E : EA(1) or EB(2)?"));
return int.Parse(Console.ReadLine());
}
public string AskString(string Name)
{
Console.Write(string.Format("{0} ? ", Name));
return Console.ReadLine();
}
public int AskInt(string Name)
{
Console.Write(string.Format("{0} ? ", Name));
return int.Parse(Console.ReadLine());
}
}
//In the Program :
class Program
{
static void Main(string[] args)
{
View.View view1 = new View.View();
Presenter.Presenter presenter1 = new Presenter.Presenter();
presenter1.SetView(view1);
presenter1.MakeModel();
}
}
Est-ce logique? Y a-t-il un nom pour la chose que j'essaie de faire? (à côté de "Une chose étrange") Etes-vous au courant d'un modèle de conception que je devrais lire? J'ai enseigné le mélange du motif de conception Builder avec le MVP, mais je ne suis pas sûr de savoir comment je ferais cela.
Merci
J'ai écrit ce code avec la visionneuse étant une console, mais en fait je prévois d'utiliser un "IView" parce que les vues réelles seront WinForm et WebForm. De plus, les entrées seront un peu plus complexes (dropdown et zone de texte numérique principalement) donc j'ai prévu de faire des contrôles utilisateur pour chaque type de composant. J'ai également prévu de faire en sorte que le Présentateur lise les informations directement à partir de la vue (et ne rende pas les valeurs de retour de la vue). Compte tenu de cette information supplémentaire, pourriez-vous quand même me suggérer d'aller avec le MVC au lieu du MCP? Merci pour votre contribution, c'est vraiment apprécié. – Tipx
Avec WebForms, MVP peut être utile. Il est difficile de créer un MVC pour WebForms tel qu'il est. Un MVP peut également fonctionner avec Windows Forms, car WinForms et WebForms fonctionnent de manière très similaire. Cependant, cela ne change pas vraiment l'image. Il est très important que la vue soit "bête" et que le présentateur gère les entrées. Le présentateur ne devrait jamais avoir à demander à la vue pour quoi que ce soit ... comme l'entrée doit d'abord être acheminée par le présentateur, et non l'inverse. Une implémentation IView devrait donner au présentateur la possibilité de pousser les données vers la vue, mais pas grand-chose d'autre. – jrista
Merci, je vais garder cela à l'esprit pendant que je vais essayer certaines choses. J'ai une formation inégalée en programmation et je n'ai pas vu beaucoup de modèles de design, mais je ne doute pas que vos conseils m'épargneront des pièges! (même ainsi, je ferai des erreurs, mais j'apprendrai d'eux.) Merci. – Tipx