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

Windows Forms Discussion :

Redefinition Operateur Class


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Redefinition Operateur Class
    Bonjour,

    Sur des cours trouvé sur votre site, il est expliqué comment redéfinir des opérateur pour une classe.

    J'ai essayé le code mais le résultat obtenu n'est pas celui attendu.

    Voici ma classe ListeDePersonne qui est sensé redéfinir l'opérateur pour pouvoir concaténé une personne en plus dans la liste.

    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
    public static ListeDePersonne operator +( ListeDePersonne l,personne p)
        {
            l.Add(p);
            return l;
        }
     
        public static void Main()
        {
            ListeDePersonne l=new ListeDePersonne();
     
            l = l + new personne("michel", "DUPONT", 29) + new personne("david", "PIGNON", 32); 
     
            Console.Out.WriteLine("liste =" + l );
        }
     
        public override string ToString()
        {
     
            String liste = "(";
            int i;
     
            for (i = 0; (i < Count - 1); i++)
            {
                liste += "[" + base[i].ToString() + "]" + ",";
            }
            if (Count != 0) liste += "[" + base[i].ToString() + "]";
            liste += ")";
     
            return liste;
        }
    En plus de celle-ci, je définie une classe personne qui me créé une personne (Prénom, Nom,age).

    Résulat attendu :
    liste = [Michel dupont 29],[David pignon 32]

    Résultat obtenu :
    liste = [personne],[personne]

    Quelqu'un peut-il me dire pourquoi

    MERCI

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    As tu bien overridé le .ToString() de Personne ? J'en doute vu les resultats obtenus.

    Quelque petit conseil cependant, ton string construit le avec un stringbuilder pas une concatenation de string (à 1000 instance de personne, tu vas rendre fou ton GC pour rien). Enfin deuxieme chose, faire un ToString de collection qui renvoit une chaine aggrégé de ce qu'il contient, c'est pas une bonne idée (AMHA, bien sur).

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour tes conseils.
    Je n maitrise pas du tout donc j'essaye de suivre ce qui est dit en essayant de comprendre donc tout ce qui est amélioration de code pour l'instant je n'y pas pas de temps.
    Je me suis rendu compte qu'il manquait du code en effet ma classe ListeDePersonne n'est pas un héritage d personne mais une ArrayList comme le montre le code suivant.

    public class ListeDePersonne:ArrayList
    {

    public static ListeDePersonne operator +( ListeDePersonne l,personne p)
    {
    l.Add(p);
    return l;
    }

    public static void Main()
    {
    ListeDePersonne l=new ListeDePersonne();

    l = l + new personne("michel", "DUPONT", 29) + new personne("david", "PIGNON", 32);

    Console.Out.WriteLine("liste =" + l );
    l=l+new personne("Bassou","METRAL",34);
    Console.Out.WriteLine("liste = " + l);

    }

    public override string ToString()
    {

    String liste = "(";
    int i;

    for (i = 0; (i < Count - 1); i++)
    {
    liste += "[" + base[i] + "]" + ",";
    }
    if (Count != 0) liste += "[" + base[i] + "]";
    liste += ")";

    return liste;
    }
    }

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Il faut surtout redefinir le .ToString de la classe Personne pour faire ce que tu veux faire. =)

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    MERCI.

    En effet il fallait overrider mon ToString dans ma classe personne.
    Donc si j'ai bien compris, il faut overrider TOUTES les classe (Filles et mères) lors de l'utilisation d'une instruction comme ToSring ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Non, pas du tout.

    Normalement (dans les plupart des cas), un .ToString() te renvoie une description de l'objet (comprendre principalement son type, le cas ici), si tu veux qu'un ToString te renvoie autre chose tu le redefinies.

    Ici, tu voulais que ta collection ait une description particuliere ET que ton objet Personne ait aussi une description particuliere, donc tu dois redefinir Personne et ListeDePersonne. C'est pas plus compliqué que ca. =)

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Pourquoi tu utilises un ArrayList plutot qu'une collection typée ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je connais pas la collection typée.
    Je lis un cours sur C# et dans ce chapitre ils expliquent le changement d'opérateur et pour cette exemple ils sont passé par une arraylist.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Points : 780
    Points
    780
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Personne
    {}
     
    psvm()
    {
       List<Personne> kList = new List<Personne>();
       kList.Add( new Personne("BadBoy") ); 
    foreach( Personne kPersonne in kList )
    {
      Console.Write( kpersonne ); // necessite redef .ToString de Personne ; plutot que de Console.Write, un StringBuilder c'est plus cool 
    }
    }
    Définir un opérateur "+" sur une Collection pour pas utiliser le "add" c'est quand même aimer la surcharge de travail

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Chubyone Voir le message
    Définir un opérateur "+" sur une Collection pour pas utiliser le "add" c'est quand même aimer la surcharge de travail
    Oui, ça a un coté un peu marteau pilon pour écraser un cafard.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

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

Discussions similaires

  1. Redefinition of class MAIS avec #ifndef
    Par Walther Bishop dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2013, 00h24
  2. Réponses: 5
    Dernier message: 23/11/2008, 19h26
  3. Probleme operateur classe iterateur perso
    Par SOAD08 dans le forum C++
    Réponses: 2
    Dernier message: 14/02/2007, 19h03
  4. redefinition operateur
    Par crischprolch dans le forum C++
    Réponses: 16
    Dernier message: 08/05/2006, 20h07
  5. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51

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