IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langages Discussion :

Modification d'attributs objet


Sujet :

Langages

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 44
    Par défaut Modification d'attributs objet
    Bonjour,

    Je rencontre un soucis que je ne comprend pas : J'utilise deux objets de même type à un moment donné.
    Lorsque j'utilise une méthode d'un objet afin de modifier certains attributs il se trouve que l'autre objet est aussi "impacté" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CmbdSystem popi = xmlSystem.subsystems[0].system;
    mbdSystem.GetRunnable();
    // CmbdSystem popi ; popi a été modifé
    Mon objet xmlSystem est également modifié après modification de mon objet mbdSystem.

    Voici ce que fait la méthode GetRunnable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public  void GetRunnable() 
            {
                foreach (CmbdSubSystem sub in subsystems)
                {
                    CmbdSystem system = FindSystem(sub);
                    if (system.IsaRunnable())
                    {
                        runnables.Add(system);
                    }
                }
            }
    D'où ça peut venir ?
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Par défaut
    Salut,

    Sans savoir comment tu attribut ton objet "mbdSystem" c'est dur de t'apporter une réponse mais si quand tu modifies une instance d'un objet, une autre instance est aussi modifiée, cela signifie tout simplement que les 2 instances sont les mêmes.

    Après dans ta fonction GetRunnable tu ne modifies rien tu ne fais qu'ajouter ton instance "system" dans une liste...

    Ajoute plus de code pour qu'on puisse comprendre ce qui est modifié et où

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 44
    Par défaut
    Tout d'abord voici la classe CmbdSystem des deux objets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    public class CmbdSystem
    {
        public string systemName { get; set; }
        public List<CmbdSubSystem> subsystems { get; set; }
        public List<CmbdSystem> runnables { get; set; }
     
        public CmbdSystem()
        {
            subsystems = new List<CmbdSubSystem>(); // susbsystems (that contains runnables) of the system selected
            systemName = null;
            runnables = new List<CmbdSystem>();
        }
     
        private CmbdSystem FindSystem(CmbdSubSystem subSystem)
        {
            return subSystem.system;
        }
     
        public bool IsaRunnable(){}
     
        public void GetRunnable()// utilisé afin de remplir la liste de runnable  de l'objet.
        {
            foreach (CmbdSubSystem sub in subsystems)
            {
                CmbdSystem system = FindSystem(sub);
                if (system.IsaRunnable())
                {
                    runnables.Add(system);
                }
            }
        }
     
    }
    J'utilise un formulaire de type Windowsform et les deux attributs mbdSystem et xmlSystem appartiennent à la classe Windowsform.
    C'est à travers un bouton que ces attributs sont "chargés".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    public FormImport() // Constructeur
            {
                mbdParse =  new CmbdParse();
                InitializeComponent();
                xmlSystem = null;
                mbdSystem = null;
            }
     
    private void buttonGetModel_Click(object sender, EventArgs e)
            {
                listRunnable.Height = 17;
                listRunnable.Items.Clear();
                if (mbdParse.UnzipSlxFile(slxPathBox.Text))
                {
                    addTaggedValue(currentElement, tag2, "SlxPath", mbdParse.slxPath);
                    slxPathBox.Text = mbdParse.slxPath;
                    xmlSystem = mbdParse.ParseFile();
                    if (xmlSystem == null)
                    {
                        MessageBox.Show("Architecture error in the Xml File, please check the file");
                        import_button.Enabled = false;
                    }
                    else
                    {
                        mbdParse.DeleteFile();
                        mbdParse.ClearMbd_Systems();
                        mbdParse.GetMbd(xmlSystem, mbdName);// remplis une liste<CmbSystem>
                        if (mbdParse.mbd_Systems.Count == 1)
                        {        
                            mbdSystem = mbdParse.mbd_Systems[0];
                            GetOutDataTypeStr(xmlSystem, mbdSystem);
                            if (!mbdSystem.IsaRunnable())
                            {
                                CmbdSystem popoo = xmlSystem.subsystems[0].system;
                                mbdSystem.GetRunnable();
                                foreach (CmbdSystem runnable in mbdSystem.runnables)
                                {
                                    GetOutDataTypeStr(mbdSystem, runnable);
                                }
                                int count = mbdSystem.runnables.Count;
                                listRunnable.Height += (count - 1) * 13; 
                                foreach (CmbdSystem runnable in mbdSystem.runnables)
                                {
                                    listRunnable.Items.Add(runnable.systemName);
                                }
                            }
                            import_button.Enabled = true;
                        }
     
                    }
                }
     
            }
    J'ai également l'impression que xmlSystem et mbdSystem sont considérés comme étant la même instance mais ils ne sont pourtant pas mis en relation l'un l'autre.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 44
    Par défaut
    Je pense avoir capté :

    Lorsque je modifie l'un des deux objets l'autre est également modifié.

    Ma classe system est composé de sous-systèmes eux même composé de system (un peu comme un arbre).

    L'objet xmlSystem représente le système entier tandis que mbdSystem est une "portion" de ce système. J
    'imagine que malgré le fait de "récupérer" ou affecter cette portion à mon objet mbdSystem. Toute modification faite sur l'un de ses deux objets entraîne la modification de l'autre.

    Je n'ai pas trouvé l'adresse de ces deux objets mais il doit s'agir de la même ?

    Merci

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    est-ce que déjà tu es au courant de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var p = new Person();
    p.Name = "a";
     
    var p2 = p;
    p2.Name = "b";
     
    var s = p.Name; // ici s vaudra "b", pas "a"
    sinon va lire des cours de POO avant de coder.
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2017
    Messages : 44
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    est-ce que déjà tu es au courant de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var p = new Person();
    p.Name = "a";
     
    var p2 = p;
    p2.Name = "b";
     
    var s = p.Name; // ici s vaudra "b", pas "a"
    sinon va lire des cours de POO avant de coder.
    Bonjour

    C'est exactement ce que je cherche à éviter, toujours selon certains cours de POO
    il m'a été conseillé de déclarer une nouvelle instance avec les attributs de P (dans cette exemple).
    Et ça n'a pas marché.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] [1.1] Modification d'attributs d'un noeud XML
    Par Sup@Lou dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/08/2006, 16h35
  2. Modification des attributs d'un TComPort
    Par Reven777 dans le forum C++Builder
    Réponses: 3
    Dernier message: 28/06/2006, 11h16
  3. Réponses: 7
    Dernier message: 21/06/2006, 15h43
  4. Réponses: 4
    Dernier message: 18/02/2006, 16h48
  5. Modif des attributs d'une balise <param> en javascript
    Par Henri dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/08/2005, 22h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo