ToString + Helppp + Problème

Résolu
Signaler
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
-
Bonjour à tous,



Est ce que dans une classe y'a moyen d'avoir plusieurs ToString() par exemple :

C'est à dire en faite si je fais listbox.items.Add(jean) ; // jean une instance avec nom jean, prenom paul



je peux choisir si il va m'afficher, jean ou jean paul



[Serializable]

public __gc class Personne

{



// Propriétées de Personne



private :



int personne_id;

// ID de la personne

String personne_nom;
// nom de la
personne

String * personne_prenom ; // prénom de la personne



String ToString ()


{


return personne_nom ;


}



String ToString ()


{


return String.Concat(personne_nom," ",personne_prenom) ;


}



};

17 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Re,
Non une classe ne peux pas définir plusieurs fois la même méthode, sinon comment savoir laquelle appeler !?
Par contre, on peut surcharger les méthodes, pour avoir plusieurs fois le même nom, mais une signature différente (liste des arguments passés).

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Je crois tu as pas compris :
Si tu ajouter un object dans un listbox il appelle la méthode ToString() et ajoute ce string qui est retourné par l'object. Pour personnalisé la chose, tu peux décider d'overrider cette méthode et de retourner ce que tu veux.
Maintenant c'est clair que cette méthode n'est pas magique, elle va pas te retourner une fois Jean et une fois Jean-Claude.
Tu es obligé de faie une property, ou de mettre un argument supplémentaire dans le constructeur, ou autre, pour informer le ToString de qu'est ce qu'il doit retourner !

public override string ToString()
{
switch(this._variable)
{
case x : return "Jean"; break;
case y : return "Jean-Claude"; break;
}
}

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
String* ToString ()


{


return "bonjour" ;


}



En faite je pense que quand on fait ca on masque la méthode ToString de
la classe Object mère de toute les classes. Quand on masque si on
appelle une methode de classe il regarde si il la trouve dans la classe
elle même sinon il monte dans la hierarchie des classes et si il la
trouve il y a une erreur de compilation. Donc en faite là je masque
ToString de la classe Object et si je fais



String* ToString (bool a)



{





}



Il va pas reconnaitre la fonction ToStirng de la classe Object donc je pense que c mort.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Donc pour résoudre ton problème, tu créer un autre toString en lui passant un argument, par exemple un enum : Affiche.Prenom ou Affiche.Nom pis tu fais un switch dessus dans ta méthode (c'est une solution parmis d'autres).

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
mais si je fais :



jean.nom = "jean" ;

jean.prenom = "claude" ;



listbox.items.Add(jean) ;



Il va directement regardé si il voit un ToString et pas un ToString (mon argument) ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Oui, c'est la méthode ToString() sans argument qui est appelée, celle de la class mère par excellence, object.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Ben je peux pas differencier alors ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Je ne comprend pas exactement ce que tu veux faire en fait !?

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ben en faite, si je fais :



listbox.items.Add(jean) ;



je veux que dans le listbox il rajoute ("jean") ; // nom



et si je refais :



listbox.items.Add(jean) ;



il rajoute dans le listbox "jean claude" // nom + prénom



Enfin pouvoir controler ce qu'il va afficher dans le listbox.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
C'est pas logique !
Tu peux pas faire listbox.items.Add(jean) ;
Et une fois tu veux jean et une autre jean-claude !

Il faut un critère qui permette de différencier les cas.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Ben comment faire ? Dans la classe Personne d'ou est issu jean je masque ToString() ;
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ben si je met un arguement suplementaire ca va être ToString(mon argument) et plus ToString() donc ca va point marcher.



public override string ToString()

{

switch(this._variable)

{

case x : return "Jean"; break;

case y : return "Jean-Claude"; break;

}

}



Je connais pas en faite override this._variable c'est quel variable ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Tu fais expres ?
Ecoute le plus simple, (et meme plus logique) c'est que tu fasses

listBox.Items.Add(jean.Prenom);
ou
listBox.Items.Add(jean.Nom);

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Ben je sais pas si je fais :



listBox.Items.Add(jean); // Instance de la classe Personne



il va m'afficher dans le listbox un String par défaut il va m'afficher
"Personne" parceque ToString dans Object retourne le nom de le classe
mais c'est juste que je le masque dans la classe Personne() c'est tout
et c'etait pour savoir si il y avait une astuce pour pouvoir choisir la
chaine qu'il va retourner. Ben faire jean.nom ca complique la chose en
faite. C'est pour ca que je prefere ajouter directement l'objet dans le
listbox. Enfin merci pour ton aide je vais voir ce que je peux faire.
Peut être créer une classe special, parceque dans mon listbox je vais
pas rajouter que des objets personnes.
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
Finalement j'ai fais comme ca, si ca interesse quelqun :



static bool test ;



String ToString ()

{



if (test == true)

return profil_nom ;

else

return Conver.ToString(profil_id) ;



}



avec un champ statique
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
C'est exactement ce que je te disais de faire mais à la place d'utiliser un bool et un if, je te proposais un enum et un switch...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
903
Date d'inscription
mercredi 23 février 2005
Statut
Membre
Dernière intervention
16 juin 2010
2
ah ok, ben j'avais pas compris, c'etait pas de la mauvaise volonté, lol, en faite je suis pas très fort en c#.