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

C# Discussion :

[C#] Comment réaliser une copie complète d'objet ?


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 41
    Points : 24
    Points
    24
    Par défaut [C#] Comment réaliser une copie complète d'objet ?
    Bonjour,

    J'ai un object pouvant contenir une collection du meme type et chaque element de cette collection peuvent contenir une collection du meme type a nouveau. Bref j'ai un arbre quoi...

    Voici mon probleme: j'aimerai cloner cet object et le rajouter a la collection qu'il contient.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    						Board newBoard= new Board(i-1,j-1);
    						newBoard.Grid=CurrentBoard.Grid;
    						newBoard.Turn=CurrentBoard.Turn;
    						newBoard.Move();
    						CurrentBoard.Boards.Add(newBoard);
    						CurrentBoard=CurrentBoard.Boards.GetLast();
    						PrintScreen();
    Le probleme c'est que cela me fait une copie partielle ( que les reference) mais moi j'ai besoin d'une copie complete parce que sinon mon ".move()" ben il me change toutes les "Grid" de l'arbre .

    Donc si quelqu'un peut me dire comment faire cette fameuse copie complete

    Merci

    edit: A oui en plus le probleme c'est que j'aimerai copier completement que grid et turn et pas le parent de l'object

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Les collections doivent normalement implémenter la méthode CopyTo() qui est faite pour ça.
    On ne peut pas faire boire un âne qui n'a pas soif.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 41
    Points : 24
    Points
    24
    Par défaut
    Salut, merci de repondre mais elle n'existe pas dans mon cas :
    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
    using System;
     
    namespace Othello
    {
    	public class BoardCollection : System.Collections.CollectionBase
    	{
    		public BoardCollection(Board Owner)
    		{
    			m_oOwner = Owner;
    		}
     
    		private Board m_oOwner; 
     
    		public void Add(Board oBoard)
    		{
    			oBoard.parent = m_oOwner; 
    			List.Add(oBoard); 
    		}
     
    		public void RemoveLast()
    		{
    			List.RemoveAt(Count -1); 
    		}
     
    		public void Remove(int index)
    		{
    			List.RemoveAt(index); 
    		}
     
    		public Board Item(int Index)
    		{
    			return (Board) List[Index];
    		}
    		public Board LastItem()
    		{
    			return (Board) List[Count -1];
    		}
    	}
    }
    De plus je copie l'object parent a la collection, pas un object de la collection.

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Points : 350
    Points
    350
    Par défaut Re: [c#] Clonage d'objet
    Citation Envoyé par Revan012
    Donc si quelqu'un peut me dire comment faire cette fameuse copie complete

    Merci
    Salut,

    tu dois implémenter toi même la methode Clone via l'interface IClonable.

    Pour une copie d'un objet simple tu peux faire comme ça ( version VB ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class MaClasse
        Implements ICloneable
     
        ' ...
     
        Function Clone() As Object Implements ICloneable.Clone
            Return Me.MemberwiseClone
        End Function
    End Class
    Par contre la methode miracle MemberwiseClone a ses limites : si ton objet a ses propres dépendances ( = sous objets ) ils ne seront pas copiés.

    Dans ce cas là c'est au programmeur se taper le code qui va bien pour réaliser la copie.

    Une solution de fainéant est de sérialiser et désérialiser en binaire pour effectuer le clonage en 3 lignes ( je garantis pas les perfs ).

    voila A+

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 41
    Points : 24
    Points
    24
    Par défaut
    Salut,
    Merci de ta reponse.
    Je rencontre un autre probleme :
    MemberwiseClone renvoi un object de type object mais dans mon cas j'aimerai recup un object de type board

    Sinon cette solution pourai m'aider (enfin atendons le resultat pour etre sur)

    merci

    edit: c'est bon j'ai trouver :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newBoard= (Board) CurrentBoard.Clone();

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 41
    Points : 24
    Points
    24
    Par défaut
    Ca fonctionne toujours pas
    Quand je fait ma fonction move() ca me change toujours toutes les grids de l'arbre.


    En fait je vai reposer ma question au cas ou :

    donc quand on a deux variable i et j
    si je fait
    i prend la valeur de j on est dacord.

    Mais avec cette foutu collection ben mon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NewBoard.Grid=CurrentBoard.Grid
    Ne fait que prendre l'adresse de la grid (enfin je supose puisque quand je change l'un ca me change l'autre.)
    Mais moi je veu que ca me fasse comme un i=j quoi

    Merci encore.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 41
    Points : 24
    Points
    24
    Par défaut
    Aprés un court pétage de cable je vien de trouver la solution, Kikos m'a donnée une idée j'ai utilisé la fonction clone mais pour autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newBoard.Grid=(int[,]) CurrentBoard.Grid.Clone();
    Maintenant ca fonctionne et je me dit que c'etait plutot evident.
    Je vien donc de faire Latche... désolé

    Merci pour votre soutien

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par Revan012
    Kikos m'a donnée une idée j'ai utilisé la fonction clone mais pour autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newBoard.Grid=(int[,]) CurrentBoard.Grid.Clone();
    Ben c'est bien ainsi que ca s'utilise ( j'aurais dû préciser ).

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/01/2008, 09h17
  2. [SQL] Comment réaliser une fonction d'incrementation ?
    Par da_latifa dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/12/2005, 11h14
  3. Réponses: 4
    Dernier message: 25/12/2005, 18h46
  4. Réponses: 1
    Dernier message: 09/12/2005, 13h43
  5. [FLASH MX] Comment réaliser une forme dentelée
    Par celina5880 dans le forum Flash
    Réponses: 4
    Dernier message: 04/11/2004, 17h48

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