Copier un tableau d'objet

redpooka Messages postés 55 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 18 mai 2004 - 4 mars 2004 à 17:12
redpooka Messages postés 55 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 18 mai 2004 - 6 mars 2004 à 11:24
J'ai un tableau A, et un tableau B.
Le tableau A contient des objets.

J'ai besoin de copier le tableau A en B.
Or si je modifie les objets du tableau B cela modifie identiquement ceux de A (logique).
Justement je veux lorsque je modifie les objets de B que ca ne modifie pas A.
Comment faire ?

(Les tableaux sont des tableaux, et ne sont pas des arraylist ou collection.)

5 réponses

gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
4 mars 2004 à 21:35
en faisant ta copie, tu affecte a des elements de ton tableau b des references de ton tableau a, ce qui implique des copies d'adresses mémoires et non de contenu.
Pour copier un contenu, tu dois implementer dans les objets à copier une méthode pour dupliquer l'objet afin de donner une autre référence à l'élément correspondant de ton tableau b.

[Membre du Labo .NET]
0
redpooka Messages postés 55 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 18 mai 2004 2
4 mars 2004 à 23:05
Justement là est mon problème je ne sais pas comment implémenter la méthode pour dupliquer.

Je ne vois pas comment trop m'y prendre.

Voici une méthode, mais je ne pense pas qu'elle soit propre.
C'est de créer un nouvel objet, et de retourner toutes les valeurs de l'objet que je veux copier, et les insérer dans le nouvel objet ?
0
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
5 mars 2004 à 10:35
ben c une solution, par exemple une classe personne :
class Personne{
    private int _age;
    private string _nom;

    public Personne(int age, string nom){
        _age = age;
        _nom = nom;
    }

    public Personne Clone(){
        return new Personne(_age,_nom);
    }
}


[Membre du Labo .NET]
0
redpooka Messages postés 55 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 18 mai 2004 2
5 mars 2004 à 23:22
Merci beaucoup pour la réponse.

Mais j'ai un problème avec la solution.
Vu que j'ai une classe Pere, une classe garcon, et fille qui héritent de pere.
J'ai des objets Garçons et des objets filles qui sont dans un tableau. Et que j'ai justement besoin de copier.

Or comment faire pour pouvoir retourner le bon type d'objet ?

Si je met dans les classes enfants

public Garcon Clone() { return new Garcon();}

Pareil dans la classe fille.

Dans mon foreach qui s'occupe du copiage

foreach(Pere Temp in MyArrayList)
Temp.Clone();

Ne marchera pas

Et si j'utilise dans la classe père, un "public virtual" je ne retournerais pas le bon type ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
redpooka Messages postés 55 Date d'inscription mardi 18 février 2003 Statut Membre Dernière intervention 18 mai 2004 2
6 mars 2004 à 11:24
Voilà ce que j'ai fait pour remedier à mon problème.
Mais je ne pense psa que ca soit propre.
Comment faire pour que ça le soit ?

using System;
using System.Collections;

namespace ConsoleApplication1
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Garcon A= new Garcon();
Fille B= new Fille();

Pere[] Tab = new Pere[3];
Tab[0]=A;
Tab[1]=B;
for(int i=0; i<Tab.GetLength(0); i++)
if(Tab[i]!=null)
{
if(Tab[i].GetName()=="Garcon")
{
Garcon tmpobj;
tmpobj=(Garcon)Tab[i];
tmpobj=tmpobj.Clone();
tmpobj.chg("Coucou");
Console.WriteLine(tmpobj.GetName());
Console.WriteLine(Tab[i].GetName());
}
if(Tab[i].GetName()=="Fille")
{
Fille tmpobj;
tmpobj=(Fille)Tab[i];
tmpobj.Test();
}
}

Console.ReadLine();
}
}

class Pere
{
protected string Name;

public Pere(string nom){this.Name=nom;}

public virtual void Nom(){Console.WriteLine("Pere");}

public string GetName(){return Name;}

public void chg(string name){Name=name;}
        }

class Garcon:Pere
{
public Garcon():base("Garcon"){}

public override void Nom(){Console.WriteLine("Garcon");}

public  void Test(){Console.WriteLine("test G");}

public  Garcon Clone(){return new Garcon();}
}

class Fille:Pere
{
public Fille():base("Fille"){}

public override void Nom(){Console.WriteLine("Fille");}

public Fille Clone(){return new Fille();}

public  void Test(){Console.WriteLine("test F");}
}
}
0