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 :

Comment cloner un objet ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut
    Bonjour,

    Je pensais que ça existait par défaut le clonage d'un objet en c# : .clone()
    Faut écrire soit même la procédure ?

    L'ajout de ICloneable ne suffit pas

    il faut mettre ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public object Clone()
       {
          return this.MemberwiseClone();      // call clone method
       }
    rien d'autre ..!?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par toss.net Voir le message
    L'ajout de ICloneable ne suffit pas
    Si mais il faut implémenter la mise en oeuvre de l'interface, c'est le principe des interfaces. On exprime un contrat (l'interface) et la classe qui souhaite utiliser ce contrat doit ensuite l'implémenter.
    L'interface n'est néanmoins pas forcément nécessaire. Elle peut être utile si tu as besoin de cloner des objets sans forcément les connaître. Auquel cas tu les manipuleras via l'interface

    Concernant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public object Clone()
    {
          return this.MemberwiseClone();
    }
    cela peut suffire et cela va surtout dépendre du type de copie que tu veux faire : superficielle ou en profondeur. MemberwiseClone effectuant une copie superficielle.

    Si le clonage est superficiel et que l'objet cloné possède des références sur d'autres objets, alors ces derniers ne seront pas clonés.
    Le clonage en profondeur consiste à cloner le graphe d'objets entier, ou bien jusqu'à une certaine profondeur suivant les cas.

    Il est évident que si ton objet ne possède pas de référence vers d'autres objets alors MemberwiseClone est suffisant.

    Donc la question est, de quoi as-tu besoin ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    A noter que le principe de l'interface ICloneable est largement critiqué dans la communauté .NET, parce que ça n'indique pas du tout le type de copie qui est effectuée (profonde ? si oui, jusqu'à quel niveau ? superficielle ?)

    Au final, si c'est juste pour un objet, autant créer directement une méthode Clone qui fait ce que tu veux, sans forcément implémenter l'interface ICloneable (qui n'apporte finalement rien d'utile)

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 338
    Par défaut
    En gros je comprends que je vais reprendre mes vielles méthodes VB6 , du genre pour un classe simple sans référence...
    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
    Public Function Clone() As cMonObjet
     
        Set Clone = New cMonObjet
        Clone.Forme = Forme
        Clone.CoteA = CoteA
        Clone.CoteB = CoteB
        Clone.CoteC = CoteC
        Clone.Distance = Distance
        Clone.Angle = Angle
        Clone.Multiple = Multiple
        Clone.Repere = Repere
        Clone.Couleur = Couleur
        Clone.FormuleCoteA = FormuleCoteA
        Clone.FormuleCoteB = FormuleCoteB
        Clone.FormuleCoteC = FormuleCoteC
    End Function

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par toss.net Voir le message
    En gros je comprends que je vais reprendre mes vielles méthodes VB6
    Ben si fais juste une copie superficielle de tous les membres, autant utiliser MemberWiseClone. Si tu veux choisir les membres qui sont copiés, là il faut le faire à la main... Je ne vois pas comment on pourrait s'y prendre autrement

  6. #6
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Bonjour

    Juste en passant, si tu veux cloner des objets en contenant d'autres, pourquoi ne pas les faire hériter d'un ancêtre qui offre une methode clone() et effectue un clone memberwise.

    Ensuite les macro-objets redéfinissent la methode en faisant un base + appel de methode clone des objet inclus...

    (et faire ce qui va bien avec tout ça )

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

Discussions similaires

  1. Comment cloner un objet ?
    Par rei.uchiwa dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2010, 22h48
  2. Cloner un objet : comment créer l'instance ?
    Par phplive dans le forum Langage
    Réponses: 8
    Dernier message: 29/05/2005, 18h27
  3. [C#] Comment cloner en c#
    Par borgfabr dans le forum Windows Forms
    Réponses: 6
    Dernier message: 28/04/2004, 12h00
  4. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34
  5. Comment cloner un composant
    Par totoranky dans le forum Composants
    Réponses: 2
    Dernier message: 12/04/2003, 15h29

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