Class qui instancie une autre classe

Bonjour à tous !

Je suis développeur C# débutant, et je me demande quelle est la façon correcte de résoudre mon problème. Des exemples seront plus explicites :

Je souhaite sérialiser-déserialiser des objets contenus dans une List<Personne> qui généreraient un XML du genre :

<?xml version="1.0" encoding="UTF-8">
<ArrayOfPersonne>
  <Personne>
    <Nom>DUPONT</Nom>
    <Prenom>Jean</Prenom>
    <Adresse>
      <Ville>Paris</Ville>
       <Cp>75000</Cp>
     </Adresse>
  </Personne>
  <Personne>
    <Nom>JAQUES</Nom>
    <Prenom>Bernard</Prenom>
    <Adresse>
      <Ville>Montpellier</Ville>
      <Cp>34000</Cp>
    </Adresse>
  </Personne>
</ArrayOfPersonne>


J'ai donc une classe Personne :

class Personne{
  string nom, prenom;

  public string Prenom
  {
    get { return prenom; }
    set { prenom= value; }
  }

  public string Nom
  {
    get { return nom; }
    set { nom = value; }
  }

  public Personne()
  {
  }

  public Personne(string unPrenom, string unNom)
  {
    prenom = unPrenom;
    nom = unNom;
  }

}


Ainsi qu'une classe Adresse :

class Adresse{
  string ville, cp;

  public string Ville
  {
    get { return ville; }
    set { ville= value; }
  }

  public string Cp
  {
    get { return cp; }
    set { cp= value; }
  }

  public Adresse()
  {
  }

  public Adresse (string uneVille, string unCp)
  {
    ville = uneVille;
    cp = unCp;
  }

}


Je n'ai pas préciser ici les paramètres pour la sérialisation XML, ceux ci ne me posant pas (encore ^^) de problèmes.

Je souhaiterai donc savoir comment gérer en C# l'imbrication de l'objet Adresse dans l'objet Personne et surtout comment le(s) valoriser ? Passer les paramètres de Adresse dans le constructeur de Personne ne me semble pas être la bonne méthode...

Merci de votre aide :)

2 réponses

  1. Bonsoir

    tu peux faire comme ça
    class Personne{
      string nom, prenom;
      Adresse adresse;
    
      public string Prenom
      {
        get { return prenom; }
        set { prenom= value; }
      }
    
      public string Nom
      {
        get { return nom; }
        set { nom = value; }
      }
    
      public Adresse Adresse
      {
        get { return adresse; }
        set { adresse = value; }
      }
    
      public Personne()
      {
      }
    
      public Personne(string unPrenom, string unNom, Adresse MonAdresse)
      {
        prenom = unPrenom;
        nom = unNom;
        adresse = Adresse;
      }
    
    }

    1
    1. Bonsoir Whismeril, et merci pour ta réponse !

      La manière correcte est donc de passer d'inclure l'objet Adresse comme propriété de la classe Personne pour pouvoir passer l'adresse dans le constructeur de Personne ?

      Merci
      0
      1. Bonjour, c'est une manière de faire.
        Par contre, ça te limite à une adresse par personne.
        Tu peux aussi mettre une liste d'adresse, en ajoutant une propriété "type" à la classe adresse.
        Ainsi tu peux ajouter une adresse de type domicile, une de type travail, etc....

        --
        0
      2. class Personne{
          string nom, prenom;
          List<Adresse> adresses;
        
          public string Prenom
          {
            get { return prenom; }
            set { prenom= value; }
          }
        
          public string Nom
          {
            get { return nom; }
            set { nom = value; }
          }
        
          public List<Adresse> Adresses
          {
            get { return adresses; }
            set { adresses = value; }
          }
        
          public Personne()
          {
             mesAdresses = new List<Adresse>();//si tu passes par ce constructeur, la liste sera instanciée et tu pourras utiliser ses méthodes (add par exemple) sans te poser la question si c'est fait ou pas.
          }
        
          public Personne(string unPrenom, string unNom, List<Adresse> MesAdresses)
          {
            prenom = unPrenom;
            nom = unNom;
            adresses = MesAdresses;
          }
        
        }
        0
      3. D'accord, merci beaucoup pour ta réponse, je vais faire comme ça ! Nous verrons si d'autre solutions se présentent :)
        0