Partage
  • Partager sur Facebook
  • Partager sur Twitter

Constructeur qui s'apelle deux fois

Sujet résolu
    21 février 2017 à 1:22:09

     Bonjour,

    je suis un débutant,

    j'ai créé deux Classes :

    public class MonstreFacile : De
    
            {         
    
                public string name;
    
                public virtual string Name
    
                {
    
                    get
    
                    {
    
                        return name;
    
                    }
    
                    set
    
                    {
    
                        name = value;
    
                    }
    
                }
    
                public MonstreFacile()
    
                {
    
                    Name = GenerateurName();
    
                    Console.WriteLine("Naissance de " + this.name + "\n");
    
                }
    
                public virtual string GenerateurName()
    
                {
    
                    int deGenerateur = LanceLeDe();
    
                    switch (deGenerateur)
    
                    {
    
                        case 1: return "Lievro";
    
                        case 2: return "Agaric";
    
                        case 3: return "Arkos";
    
                        case 4: return "Gravios";
    
                        case 5: return "Isatis";
    
                        case 6: return "Zabeille";
    
                        default: return "bug";
    
                    }
    
                }
    
            }
    
     public class MonstreDifficile : MonstreFacile
    
            {        
    
                public new string name;
    
                public override string Name
    
                {
    
                    get
    
                    {
    
                        return name;
    
                    }
    
                    set
    
                    {
    
                        name = value;
    
                    }
    
                }
    
                public MonstreDifficile(string difficile)
    
                {             
    
                    Name = GenerateurName();
    
                    Console.WriteLine("Naissance de " + this.name + "\n");
    
                }
    
                public override string GenerateurName()
    
                {
    
                    int deGenerateur = LanceLeDe();
    
                    switch (deGenerateur)
    
                    {
    
                        case 1: return "Tigror";
    
                        case 2: return "Tropicallo";
    
                        case 3: return "Megafeu";
    
                        case 4: return "Meka";
    
                        case 5: return "Metamantides";
    
                        case 6: return "Tenebro";
    
                        default: return "bug";
    
                    }
    
                }
    
            }



    Et quand je les instancie : 

       MonstreFacile monstre = new MonstreFacile();
    
       MonstreDifficile boss = new MonstreDifficile("difficile"); 

    Ça me fait "naître" 2 Monstres Difficile :/

    Est il possible de override un constructeur ? parce que ça pourrait régler mon problème je pense.

    Ou override une propriété ? (la "name" en l’occurrence)

    Voila concrètement je veux pouvoir créer des monstres aléatoires en les instanciant (qu'ils reçoivent un nom aléatoires à leur instanciation)

    Merci d'avance pour votre aide, c'est mon premier message sur le forum , si je ne suis pas clair sur un point ou sur la norme pour poser mon problème dites le moi je suis tout ouïe.

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      21 février 2017 à 9:20:44

      Bonjour,

      C'est normal que ton constructeur soit appelé deux fois. Lors que tu fais de l'héritage, tout les constructeurs sont appelés en cascade.

      Dans ton code, il y a une répétition au niveau des constructeurs.

      Lorsque tu fais:

      
      class MonstreFacile
      {
          public MonstreFacile()
          {
              Name = GenerateName();
              Console.WriteLine("Naissance de " + Name);
          }
      }
      
      class MonstreDifficile : MonstreFacile
      {
          public MonstreDifficile ()
          {
              Name = GenerateName();
              Console.WriteLine("Naissance de " + Name);
          }
      }
      

      Et que tu vas créé unMonstreDifficile, tu vas appelé le constructeur de MonstreDifficile mais avant d'éxécuter son contenu tu vas appélé le constructeur de la classe mère, à savoir MonstreFacile.

      Pour éviter d'avoir deux affichage de "Naissance de ...." supprime uniquement le contenu du constructeur MonstreDifficile car comme dit plus haut, tu passeras forcément dans MonstreFacile pour générer le nom du monstre et afficher "Naissance de ....".

      Ce qui donnerais quelque chose comme:

      
      class MonstreFacile
      {
          public MonstreFacile()
          {
              Name = GenerateName();
              Console.WriteLine("Naissance de " + Name);
          }
      }
      
      class MonstreDifficile : MonstreFacile
      {
          public MonstreDifficile ()
              : base() // ici on force a appelé le constructeur de base, mais il est appelé même si le mot clé n'est pas présent.
          {
          }
      }
      

      En espérant avoir répondu a ta question.

      • Partager sur Facebook
      • Partager sur Twitter
        21 février 2017 à 11:14:03

        Oui merci, 

        mais du coup comment je pourrais procéder pour que les noms de MonstreDifficile à l'instanciation soient différents de ceux de MonstreFacile ?

        Et puis-je "override" une propriété ? (en l'occurence "name")

        Parce que quand j'enlève le constructeur de MonstreDifficile  la console n'affiche rien comme nom à la "Naissance()":

        "Naissance de "

        -
        Edité par Jimmy Léski 21 février 2017 à 11:29:30

        • Partager sur Facebook
        • Partager sur Twitter
          21 février 2017 à 11:26:57

          Ne fais pas deriver "monstredifficile" de "monstrefacile", mais de "monstre" et "monstrefacile" en dérivera aussi!
          • Partager sur Facebook
          • Partager sur Twitter
          ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
            21 février 2017 à 16:22:27

            Ok merci ah oui tout simplement, je vais essayer.

            Sinon quid d'une propriété en override ? 

            • Partager sur Facebook
            • Partager sur Twitter
              21 février 2017 à 18:30:56

              Jimmy Léski a écrit:

              Ok merci ah oui tout simplement, je vais essayer.

              Sinon quid d'une propriété en override ? 

              pas quid, google!

              • Partager sur Facebook
              • Partager sur Twitter
              ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                21 février 2017 à 22:21:47

                Si j'ai bien compris on peut, malgré que j'avais essayé (probablement une erreur de mon coté je ne vois pas) justement après avoir déjà check le premier lien proposé par google sur ce sujet. Mais mon niveau d'anglais ne me permet pas de saisir la différence entre new et override.
                • Partager sur Facebook
                • Partager sur Twitter
                  21 février 2017 à 22:44:22

                  Je ne sais pas non plus, jamais fais...

                  Contente toi de faire comme dans l'exemple...

                  Si bacelar passe par ici, il saura peut être expliquer la différence...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                    21 février 2017 à 23:35:34

                    La différence est assez simple à comprendre avec quelques tests pour s'aider un peu.

                    Un article facile à lire en parle ici.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Si un message vous a aidé, n'oubliez pas le +1 et de passer votre sujet en "Résolu" ! :)
                      22 février 2017 à 16:05:05

                      Salut

                      Jimmy Léski a écrit:

                      mon niveau d'anglais ne me permet pas de saisir la différence entre new et override.

                      Tu vas voir, c'est très simple : n'utilise pas new. C'est un mot-clé qui n'apporte quasiment rien mais qui peut être un source d'erreur.

                      breizhbugs a écrit:

                      Ne fais pas deriver "monstredifficile" de "monstrefacile", mais de "monstre" et "monstrefacile" en dérivera aussi!

                      Quand tu utilises de l'héritage ou que tu implémentes une interface, tu dois pouvoir dire MaClasseCourante est MaClasseParente ou IMonInterface. Peut-on dire "un monstre difficile" est "un monstre facile" ? Non. Donc tu ne dois pas faire hériter monstre difficile de monstre facile. De la même manière, un monstre facile n'est pas un dé. Tu devrais plutôt renommer dé en un truc du genre "objet à valeur aléatoire". Un monstre facile est bien un objet à valeur aléatoire.

                      Autres petits points :

                      • Fais en sorte que tes méthodes commencent par un verbe. Generateur => Generer
                      • Évite de mélanger le français et l'anglais. Nomme tout en anglais (le mieux) ou tout en français.
                      • Pas de champ publique. (Sauf éventuellement s'il est readonly ou const)
                      • Pas de new comme celui que tu as ligne 73 dans ton premier code (je ne parle évidemment pas des new pour l'instanciation de nouveaux objets)
                      • Ligne 35 et 103 : puisque tu as la propriété Name, autant l'utiliser plutôt que le champ.
                      • Ligne 35 et 103 : plutôt que de concaténer les strings avec +, utilise les chaînes interpolées, string.Format ou cette surcharge de la méthode WriteLine.
                      • Évite d'utiliser directement \n pour aller à la ligne. Sous Windows, un retour à la ligne "propre", c'est \r\n. Le mieux est d'utiliser la propriété statique Environement.NewLine.
                      • Dans ton premier code (qui a dû changer depuis, donc le problème n'est peut-être plus là), tu overrides la propriété Name. Cependant, tu gardes le même comportement. En gros, c'est comme si tu disais à tout le monde "vous avez un Name dont on peut définir et lire la valeur", puis tu t'approches d'un membre précis du groupe et tu lui dis en aparté "toi, c'est un peu particulier : tu as un Name dont on peut définir et lire la valeur".
                      • Il vaut mieux (si tu sens que tu as le niveau pour ça, c'est un tout petit peu plus complexe) mettre tes noms de monstres dans un tableau, puis lancer un dé entre 0 et la taille de ton tableau - 1 (inclus), puis aller récupérer le nom en question depuis la tableau plutôt que de faire un switch.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Il y a 2 types de personnes : celles qui sont capables d'extrapoler à partir de données incomplètes.
                        22 février 2017 à 18:43:18

                        Merci pour ces précieux conseils ! Je me les mets de coté jusqu'à les assimiler. 

                        Sinon sur le fait d'avoir directement dérivé MonstreDifficile de MonstreFacile c'est pas comme ça que j'aurais fait non plus mais c'est l'intitulé de mon exercice : 

                        https://openclassrooms.com/courses/programmez-en-oriente-objet-avec-c/tp-creez-un-petit-jeu-oriente-objet

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Constructeur qui s'apelle deux fois

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown