Modèle de stratégie avec Différents paramètres de l'interface (C#)
Je suis en fait, d'essayer de mettre en œuvre un modèle de Stratégie, mais je veux passer les différents paramètres pour les "interfaces" de la mise en œuvre (qui héritent de la même objet) et ne sais pas si c'est possible. Peut-être que je suis un mauvais choix de modèle, j'obtiens un message d'erreur semblable à
'StrategyA" n'a pas hérité de mettre en œuvre abstraite membre 'void DoSomething(BaseObject)'
avec le code ci-dessous:
abstract class Strategy
{
public abstract void DoSomething(BaseObject object);
}
class StrategyA : Strategy
{
public override void DoSomething(ObjectA objectA)
{
//. . .
}
}
class StrategyB : Strategy
{
public override void DoSomething(ObjectB objectB)
{
//. . .
}
}
abstract class BaseObject
{
}
class ObjectA : BaseObject
{
//add to BaseObject
}
class ObjectB : BaseObject
{
//add to BaseObject
}
class Context
{
private Strategy _strategy;
//Constructor
public Context(Strategy strategy)
{
this._strategy = strategy;
}
//i may lose addtions to BaseObject doing this "downcasting" anyways?
public void ContextInterface(BaseObject obj)
{
_strategy.DoSomething(obj);
}
}
- +1 un tel scénario, j'ai vu des implémentations où obj ne cesse de croître et grandir...
- Utiliser les Interfaces au lieu de Classes, par exemple interface publique (void DoSomething(BaseObject objet); } Ensuite, avoir une Stratégie hériter de cette interface. La Base de votre SP autour de l'Interface ou un IStrategy interface qui hérite de cette interface. BTW utiliser DIP pour l'Injection avec un Cio comme Ninject
Vous devez vous connecter pour publier un commentaire.
Il semble que vous êtes en train d'essayer de réinventer la Modèle visiteur, au lieu de simplement en utilisant le modèle de Stratégie de la façon dont il a été prévu.
Aussi, puisque vous êtes à l'aide de C#, je vous recommande la lecture de Judith Évêque du document intitulé Sur l'Efficacité des Modèles de Conception mis en œuvre en C# 3.0. Cela couvre de multiples approches pour le modèle visiteur dans le détail, et a quelques intéressantes, liées à des idées utiles.
En C# signature de la méthode comprend son nom, le type de liste de paramètre et le paramètre formel de la liste. Dans le code ci-dessus "remplace" ont des signatures différentes de méthode virtuelle et donc il n'est pas permis.
L'idée de base de la Stratégie de Modèle est de définir ensemble l'interchangeabilité des algorithmes avec des détails cachés à l'intérieur. Mais si vos stratégies diffèrent (par type) dans ce qu'ils peuvent accepter comme ils sont plus interchangeables. Il semble donc que ce un mauvais modèle à utiliser dans cette situation.
Vous pourriez envisager de cet article:
http://hillside.net/plop/2010/papers/sobajic.pdf
Le modèle est appelé "paramétrée modèle de stratégie" et doit correspondre à ce que vous avez besoin. Fondamentalement, il s'appuie sur le modèle de stratégie et permet des stratégies (les différents algorithmes) pour avoir des paramètres différents. Les paramètres sont encapsulés dans des classes spéciales, c'est à dire paramètre classes. Chaque stratégie (c'est à dire de l'algorithme) doit mettre en œuvre GetParameters() méthode qui renvoie la liste des parmaters cas pour l'algorithme spécifique.
La modèle de stratégie est destiné à fournir des différences de comportement sur l'entrée d'objets de même type.
Ce que vous êtes en train d'essayer de le faire dépend du contexte, et je ne suis pas sûr qu'il peut être vu à partir du code qui a été posté.
Vous pouvez créer un des Paramètres de la classe comme ceci:
Le modifier vos méthodes pour accepter les Paramètres tels que:
De cette façon, vous pouvez paramètres supplémentaires si vos besoins changent à l'avenir. Une autre alternative est d'utiliser
Dictionary<string, object>
où vous pouvez faire: