0
votes

Comment remplacer un modèle de méthode de modèle d'économie de méthode

J'ai une classe abstraite où sur le constructeur, j'appelle une méthode abstraite déclarée sur la même classe, et je le fais cela parce que je veux forcer toute la classe dérivée à ne pas simplement implémenter ma méthode abstraite mais aussi Appelez-le (je pense ici est où le motif de la méthode de modèle est disponible).

BTW: Je sais que ce n'est pas la meilleure approche pour vous assurer que toutes les choses seront correctement écrites mais que je voudrais des problèmes externes, je voudrais minimiser mes problèmes futurs avec mauvaise implémentation. L'extrait est ci-dessous: P>

This is the generic
This is the derivated2 one with x: 4; _parameter: 0


0 commentaires

3 Réponses :


1
votes

Le problème est que vous appelez le constructeur générique qui appellera des setrgules avant que votre constructeur dérivé2 est appelé votre paramètre n'a pas encore été défini. Tu pourrais essayer ceci.

public abstract class Generic
{
    public Generic()
    {
        Console.WriteLine("This is the generic");
    }

    public abstract void SetRules();
}

public sealed class Derivated2 : Generic
{
    int _param;

    public Derivated2(RulesWithParameters rules) {
        _param = rules.Parameter;
    }

    public override void SetRules()
    {
        int x = 0;
        x = 1 + 3;

        Console.WriteLine(String.Concat("This is the derivated2 with x: ", x, "; _parameter: ", _param));
    }
}
public void Main()
{
    var rules = new RulesWithParameters{
        Parameter = 5
    };
    var _class1 = FactoryMethod<Derivated2>(rules);

    var _class2 = FactoryMethod<Derivated1>(null);
}

public class Derivated1 : Generic
{
    public Derivated1(Rules rules)
    {

    }
    public override void SetRules()
    {
        Console.WriteLine("This is the derivated1");
    }
}
public class Rules
{
    public string RuleName {get; set;}
}

public class RulesWithParameters : Rules{
    public int Parameter { get; set;}
}

public Generic FactoryMethod<T>(Rules rules) where T : Generic
{
    T instance = (T)Activator.CreateInstance(typeof(T), rules);;
    instance.SetRules();
    return instance;
}


6 commentaires

Très merci monsieur mais je connais déjà ce problème à cause du flux de pipeline et, comme je l'ai dit sur ma question II, je ne voudrais spécifier aucun paramètre sur ma classe générique car je vais avoir un certain nombre de classes dérivées, et juste quelques-uns devraient avoir un paramètre nad peut-être 5 ou 6 d'entre eux auraient 2 ou 3 paramètres.


Vous pourriez déplacer les this.setrules (); dans le constructeur des classes dérivées?


Je l'ai montré sur mon deuxième lien, mais je ne voudrais pas le faire simplement pour empêcher un développeur d'oublier d'appeler des setrles. C'est mon vrai but.


Vous pouvez utiliser une usine pour créer votre classe et avant de renvoyer la classe, vous pouvez appeler la sérure, de cette façon, vous pouvez simplement appeler votre usine pour obtenir la classe dont vous avez besoin et que l'usine ferait tout le reste pour vous, si l'usine est générique. n'aurait besoin que de mettre les setrgules au même endroit, pour Exmple


Je vais essayer celui-ci. Je pense que cela pourrait marcher. Je serai de retour plus tard pour vous dire.


Pourriez-vous s'il vous plaît poster une réponse me demandant de changer mon modèle en méthode d'usine et de nous donner un exemple comme SW suggère? Je peux donc uplifier cela et marquer comme réponse correcte.



0
votes

Je suppose que les constructeurs en C # ne sont pas polymorphes, vous ne pouvez donc pas appeler une méthode ultérieure de votre constructeur. Vous pouvez lire ce morceau de documentation: Article MSDN .

Aussi, il me semble une mauvaise pratique d'utiliser une telle approche en général. Le constructeur de la classe abstraite n'est pas conscient de vos détails de la mise en œuvre de votre classe descendante, et il n'est donc pas correct de mettre là l'initialisation de Dérivée2. Essayez de placer le code d'initialisation ailleurs.


0 commentaires

0
votes

Si la méthode Setrules pourrait être statique au lieu d'une instance, vous pouvez peut-être ajouter un constructeur statique et à l'intérieur de ce constructeur, vous pouvez appeler la méthode Setrules. Si ce n'est pas l'idée d'usine semble être la meilleure approche propre.


0 commentaires