Partage
  • Partager sur Facebook
  • Partager sur Twitter

C# - méthode pour instancier une classe

    13 avril 2023 à 2:09:34

    Bonjour à tous et toutes,

    Je voudrais créer une méthode de classe qui me permettrait, en passant par un constructeur, d'instancier cette classe, mais je n'ai absolument aucune idée de comment faire ça. Par exemple, je crée une classe Elève qui a pour attributs un prénom et un âge. Je voudrais créer une méthode prenant 3 paramètres, le nom de l'objet à créer, le prénom et l'âge de l'élève, pour ensuite instancier la classe avec tous les éléments renseigner lors de l'appel de la méthode. Cela permettrait par exemple à un utilisateur extérieur d'instancier la classe par une ligne de commande par exemple...

    Cela pourrait donner quelque chose comme : (même si en pratique ça ne fonctionne pas)

            class Eleve
            {
                public string Prenom { get;}
                public string Age { get;}
    
                public Eleve(string prenom, int age)
                {
                    this.Prenom = prenom;
                    this.Age = age;
                }
    
                public string InscrireNouvelEleve(string NomObjetVoulu, string PrenomVoulu, int AgeVoulu)
                {
                    Eleve NomObjetVoulu = new Eleve(PrenomVoulu, AgeVoulu);
                    return "Eleve inscrit!"
                }
            
            }



    Y a t il un moyen de cast une string en un autre type avant d'instancier la classe ? Est-ce impossible ? Existe t il une autre manière d'arriver au même résultat ?

    N'hésitez pas à me demander si ma question n'est pas clair.

    Merci d'avance pour votre aide,

    E.Kled :)

    -
    Edité par ElliotKled 13 avril 2023 à 22:49:59

    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2023 à 3:45:46

      Bonjour, Pas d'image de code totalement inutilisable par copier/coller pour tests éventuels.

      Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: vb;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      -
      Edité par AbcAbc6 13 avril 2023 à 3:46:31

      • Partager sur Facebook
      • Partager sur Twitter
        13 avril 2023 à 13:44:52

        Hello, en C# ce n'est pas possible d'utiliser une string comme nom de variable. Je peux te proposer d'utiliser un Dictionary<string,Eleve>. Bien sûr il y aura de l'adaptation et je ne sais pas si c'est compatible avec ce que tu as en tête.
        Ta fonction IncrireeNouvelEleve devrait se trouver dans un EleveController ou carrément dans l'objet Classe et tu fais var listeEleve = new Dictionary<string,Eleve>
        Je ne sais pas si cela t'as aidé. N'hésite pas si tu as des questions.

        -
        Edité par JustinVuffray2 13 avril 2023 à 13:45:19

        • Partager sur Facebook
        • Partager sur Twitter
          13 avril 2023 à 22:57:02

          Merci pour ta réponse, je vais me renseigner davantage sur les dictionnaires pour voire ce que je peux faire avec ça. J'ai cherché un autre moyen de résoudre mon problème et je voulais savoir si cela était réalisable. Ce serait de créer une variable int à côté et, à chaque fois que l'utilisateur fait appel à la fonction InscrireNouvelEleve(), incrémenter cette variable pour pouvoir l'utiliser et donner automatiquement un nom de variable à la nouvelle instance de classe. Encore une fois, il s'agit d'une idée donc s'il existe une autre manière de faire cela je suis preneur.  

          -
          Edité par ElliotKled 13 avril 2023 à 23:08:23

          • Partager sur Facebook
          • Partager sur Twitter
            14 avril 2023 à 8:10:07

            De ce que j'ai compris il te faudra convertir une string en nom de variable ? Si ce n'est pas le cas j'ai mal compris ^^'
            • Partager sur Facebook
            • Partager sur Twitter
              14 avril 2023 à 10:39:48

              > moyen de résoudre le problème 

              Pourrais-tu expliquer clairement le problème, plutôt que d'évoquer vaguement des "idées", et "d'autres facons de faire", deja qu'on ne comprend pas le code que tu ne montres pas.

              Bref, si tu pouvais montrer un petit exemple de code où on verrait ce dont tu as besoin....

              Dans ton code initial, la méthode inscrireetc devrait être statique. Ce n'est pas une instance de la classe Éleve  qui inscrit un autre Élève.

              Quand tu dis "ça marche pas", tu devrais faire voir le code qui ne marche pas, on verrait comment tu envisages d'utiliser les méthodes.

              -
              Edité par michelbillaud 16 avril 2023 à 8:34:33

              • Partager sur Facebook
              • Partager sur Twitter
                14 avril 2023 à 10:50:51

                Votre question n'est pas très claire.

                Un constructeur, c'est fait pour construire un objet/instance, en quoi cela ne répond pas à vos attentes ?

                Passer par une méthode "fabrique" peut être utile avec certain Design Patten, mais elle ne devrait pas retourner une string mais un élève.

                Qu'entendez-vous par "ligne de commande" ? Une console (CMD) est un exécutable autonome, elle ne partage pas directement des variables avec d'autres programmes.

                Si vous voulez avoir un repository des instances d'une classe, un vecteur/list statique dans la classe, alimenté par les constructeurs et mis à jour par les "finalizer" fera l'affaire en première approche, mais vous ne pourrez pas faire des choses très sophistiqué avec sans avoir pas mal de problème (multi-threading, chargement à chaud, multi-AppDomain, etc...). Si vous voulez avoir des identifiants (des noms), une approche par dictionnaire peu en effet être utile, mais si c'est juste un "int", un simple indice dans le vecteur/liste ferait l'affaire.(attention à la gestion des "trous" après libération/"finalization" dans ce cas)

                Le fait de convertir un objet en une chaîne de caractère, c'est la sérialisation.

                Le fait de convertir une chaîne de caractère en un objet, c'est la désérialisation.

                Renseignez vous sur ces sujets pour voir si cela convient à vos besoins.

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  14 avril 2023 à 15:41:40

                  En lisant ceci

                  public string InscrireNouvelEleve(string NomObjetVoulu, string PrenomVoulu, int AgeVoulu)
                      {
                          Eleve NomObjetVoulu = new Eleve(PrenomVoulu, AgeVoulu);
                          return "Eleve inscrit!"
                      }

                  j'ai l'impression que ce qui est souhaité, c'est que l'appel de InscrireNouvelEleve (qui devrait être static)

                  • crée une nouvelle instance
                  • l'enregistre quelque part (associée au nom ? pas de problème d'homonymes ?)
                  auquel cas, il y aurait peut être un Dictionary<string, Eleve> pour garder les élèves en mémoire, ou un fichier/une base base de données  ?
                  Et le "convertir un string en objet", ça serait la consultation du dictionnaire à partir du nom ?
                  ---
                  Pour ce qui est de

                  > créer une variable int à côté et, à chaque fois que l'utilisateur fait appel à la fonction InscrireNouvelEleve(), incrémenter cette variable pour pouvoir l'utiliser et 

                  j'ai l'impression qu'il s'agit d'allouer un numéro identifiant à chaque (instance représentant un) élève.
                  Et que
                  > donner automatiquement un nom de variable à la nouvelle instance de classe.

                  ça voudrait dire que cet identifiant permet de retrouver l'objet Eleve.
                  ---
                  Ce genre d'action, ça serait plutôt une méthode d'un objet qui s'occupe des données administratives d'une Ecole, certainement pas d'un Eleve.


                  -
                  Edité par michelbillaud 16 avril 2023 à 8:32:50

                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2023 à 19:56:53

                    Merci pour vos réponses, je vous prie de m'excuser si mes explications ne sont pas compréhensibles/cohérentes, je suis débutant en C# et plus généralement en POO.

                    Pour faire plus simple, je souhaite demander à l'utilisateur le prénom et le nom du nouvel élève à inscrire, me servir de ces données pour créer une nouvelle instance de la classe Eleve en lui attribuant un identifiant pour le retrouver ensuite. Je voudrais pouvoir répéter ce processus en en faisant une méthode par exemple. L'idée serait de faire un programme imitant un terminal, avec quelques commandes, pour un portail d'inscription dans une école et de gestion de profil.

                    J'espère que ma question est plus claire pour vous.

                    Merci encore de votre aide.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 avril 2023 à 8:31:22

                      Pour commencer, il faudrait que les instances d'Eleve aient un attribut/champ pour le nom.

                      Ensuite,  inscrire les élèves, certes, mais dans quoi ?

                      Il va falloir te mettre à faire l'exercice...

                      -
                      Edité par michelbillaud 16 avril 2023 à 8:37:45

                      • Partager sur Facebook
                      • Partager sur Twitter

                      C# - méthode pour instancier une classe

                      × 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