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 :

Méthode Clonage d'une classe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 41
    Par défaut Méthode Clonage d'une classe
    Bonjour à tous,
    J'ai un problème lorsque je veux cloner les membres d'une classe qui implémente une autre. Voici ce que j'ai fait :
    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
     
    public class ClassBase : ICloneable
        {
            public int int1 { get; set; }
     
            public object Clone()
            {
                return MemberwiseClone();
            }
        }
     
    public class ClassA : ClasseBase
        {
            public int int2 { get; set; }
     
            public override object Clone()
            {
                return MemberwiseClone();
            }
        }
     
    public class ClassB : ClasseA
        {
            public int int3 { get; set; }
     
            public override object Clone()
            {
                return MemberwiseClone();
            }
    Et lorsque je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    var instance = new ClassB
                                {
                                    //j'initialise l'instance avec des valeurs pour int1, int2, int3
                                };
     
        var copy = instance.Clone();
        //seul le membre de ClassB (int3) a été copié.
    Comment pourrai-je cloner les tous les membres ?

    Merci d'avance pour votre aide !

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Bizarre, ça devrait marcher...quel est ton code exact ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Sauf que le code fourni ne devrait même pas compiler
    Le code suivant est incorrect :
    Code C# : 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
     
    public class ClassBase : ICloneable
        {
            public int int1 { get; set; }
     
            public object Clone()
            {
                return MemberwiseClone();
            }
        }
     
    public class ClassA : ClasseBase
        {
            public int int2 { get; set; }
     
            public override object Clone()
            {
                return MemberwiseClone();
            }
        }

    La classe ClassA essaie de redéfinir la méthode Clone() qu'elle est sensée hériter de la classe ClasseBase or dans cette dernière la méthode Clone() n'est pas marquée comme virtuelle

    J'aimerai bien savoir comment il a fait pour compiler son code jusqu'à savoir que son clone ne fonctionne pas comme prévu.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 41
    Par défaut
    En fait mes classes avaient un autre nom et j'ai réécris un exemple plus court ^^" mais dans mon code j'avais bien la méthode Clone en abstract, sinon oui ça ne compile pas (j'ai eu le coup ^^)

    Je viens de trouver une méthode qui permet de cloner les membres des classes héritées (mais pour cela il faut marquer avec l'attribut [Serializable])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public IBaseEntity Deepclone()
            {
                using (var ms = new MemoryStream())
                {
                    var formatter = new BinaryFormatter();
                    formatter.Serialize(ms, this);
                    ms.Position = 0;
                    return (IBaseEntity) formatter.Deserialize(ms);
                }
            }
    Qu'en pensez vous de cette méthode ? (Je ne l'ai pas développer moi même, je l'ai trouvé sur stackoverflow). En tout cas elle marche très bien

  5. #5
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    J'avais fait la traduction de ton code en compilable mais je t'ai demandé le code exact pour être sûr

    Pour revenir à la discussion, il y a un autre moyen, en utilisant réflection, pour avoir la liste des propriétés/champs et copier leur valeur. A voir question perfs ce que ça donne

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Théoriquement, ça devrait suffire comme ça:
    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
     
    public class ClassBase : ICloneable
    {
        public int int1 { get; set; }
     
        public object Clone()
        {
            return MemberwiseClone();
        }
    }
     
    public class ClassA : ClassBase
    {
        public int int2 { get; set; }
    }
     
     
    public class ClassB : ClassA
    {
        public int int3 { get; set; }
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/12/2008, 11h57
  2. méthode main dans une classe de test
    Par caro_caro dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 01/11/2008, 15h00
  3. Accès aux méthodes privées d'une classe par la reflection
    Par Aurazed dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 07/07/2008, 15h41
  4. méthode add dans une classe héritant de ArrayList
    Par sliderman dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 05/06/2007, 09h27
  5. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35

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