Partage
  • Partager sur Facebook
  • Partager sur Twitter

Set une proprieté en fonction d'une autre.

Sujet résolu
    24 juillet 2022 à 11:26:00

    Bonjour,

    Je suis un total débutant en POO et je galère sur ma classe qui me permet de créer une personne totalement aléatoire.

    Je cherche à créer une personne d'un sexe et de lui assigner un nom en fonction de ce sexe. Je ne passe pas par un constructeur pour le faire, uniquement par des méthodes dans la classe.

    En gros mon code ressemble à ça en simplifier :

    class Personnage
    {
        private string _name;
        private string _gender; 
    
        public string gender { get; } = RandomGender();
        public string name { get; set; } = RandomName();
    
        private static string RandomGender(){return male or female}
        private static string RandomName() {return name}
    }
      

    Maintenant ce que je veux faire pour plus de réalisme, c'est de pouvoir ajouter à ma méthode RandomName() la possibilité de choisir un nom féminin ou masculin en lui passant la propriété gender qui vient d'être créée en faisant RandomName(gender).Mais ça ne marche pas, sans grande surprise.

    Est ce que je peux initialiser ma personne entièrement à l'intérieur d'une même classe ou me faut il une méthode qui appelle les différentes méthodes à la suite pour ensuite les transférer à un constructeur de ma classe Personne?

    • Partager sur Facebook
    • Partager sur Twitter
      25 juillet 2022 à 13:21:02

      le constructeur est en soit une méthode (appelée à la création d'une instance de la classe); donc dedans tu peux y appeler toutes les méthodes que tu veux. Et là dans ton code simplifié, tu n'as pas de constructeur https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/classes-and-structs/constructors
      • Partager sur Facebook
      • Partager sur Twitter
        25 juillet 2022 à 16:04:08

        Dans une approche POO "orthodoxe", si l'on utilise pas un Design Pattern de création spécifique, un objet créé via un constructeur (et il est toujours créé via un constructeur en C# "standard" (pas d'activation et autre désérialisation) doit être totalement opérationnel dés la sortie de son constructeur.

        Donc, à moins d'avoir de très très bonnes raisons de faire le contraire, utilisez à fond le mécanisme de constructeur pour fabriquer un objet "cohérent".

        Les lignes 3 et 4 sont superfétatoires, les lignes 6 et 7 sont plutôt maladroites (fiasco de l'initialisation des variables à moins que les spécifications du C# soit plus malignes que celles du C++), la ligne 10 montre que vous n'avez pas compris ce qu'est une méthode statique.

        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          27 juillet 2022 à 20:28:15

          Merci de vos réponses.

          Donc j'ai remodelé ma classe pour inclure un constructeur avec lequel je fais ma petite tambouille et ça marche. Je ne savais pas qu'il était possible de faire des tests logiques à l'intérieur de celui ci. Voici mon nouveau code :

          class Personnage
          {
          
              public string gender { get; } 
              public string name { get; set; }  
          
              public Personnage()
              {
                  gender = RandomGender();
                  if (gender == "Male")
                      name = RandomNameMale();
                  else
                      name = RandomNameFemale();
              }
          
          
          
              private static string RandomGender()
              {
                  Random rand = new Random();
                  int genderNumber = rand.Next(0, 2);
                  if (genderNumber == 0)
                      return "Male";
                  else
                      return "Female";
              }
              private static string RandomNameMale()
              {return $name}  
          
              private static string RandomNameFemale()
              {return $name}
          
          }

          Il est bon cette fois ci?

          • Partager sur Facebook
          • Partager sur Twitter
            28 juillet 2022 à 9:26:40

            Je suis pas trop sûr de l'implémentation des méthodes statiques "RandomNameMale" et "RandomNameFemale". Une utilisation "nouvelle" du $ ?

            Si vous ne voulez pas de nom "incohérent", il serait peut-être pertinent de rendre la propriété "name" read-only, en suppriment le "set" ligne 5.

            • Partager sur Facebook
            • Partager sur Twitter
            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
              28 juillet 2022 à 18:27:27

              Et tu as raison pour les méthodes statiques. Je n'en pas besoin et ça marche très bien en l'enlevant.

              Pour le $ c'est un vieux reflexe du PhP, il n'a effectivement rien à faire là.

              Voila, encore merci pour l'aide, j'ai pu progresser grâce à vous =)

              • Partager sur Facebook
              • Partager sur Twitter

              Set une proprieté en fonction d'une autre.

              × 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