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 :

Surcharge de methode [Débutant]


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Surcharge de methode
    Bonjour,

    Je suis debutant en C#, merci de votre indulgence si ma question est triviale.

    J'ai lu dans mon manuel de C# (C# in a nutshell) qu'une classe peut avoir plusieurs methodes de meme nom tant que leurs arguments sont de types differents (chaque methode ayant donc une signature unique puisqu'une signature de methode est definie par le couple Nom + Type des arguments)
    On appelle cela la surcharge de methode.

    J'imagine que c'est ce qui se passe par exemple pour la methode Console.WriteLine qui peut etre utilisee avec des arguments de type varies(Objet, Char, Decimal etc...). On a donc pas besoin d'appeler une methode differente pour chaque type different...

    Pensez vous que l'implementation de Console.WriteLine est bien ainsi faite (je ne pense pas qu'on puisse trouver le code source) ? Y a t'il d'autres facon d'implementer une methode qui puisse etre utilisee avec des parametres de type varies ? Je pensais a une implementation de methode qui prenne par exemple un argument de type 'var' (donc indefini) et qui en interne ferait des tests sur le type du parametre avec des typeof ou GetType pour ensuite, en fonction, retourner qqchose. Ca ne serait plus de la surcharge de methode puisqu'en interne je n'aurais qu'une seule methode definie avec un seule type - tres general- d'argument.

    Quelle est la soluation d'implementation la plus standard/recommendee/intelligente... ?

    Merci !

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par powdaddy Voir le message
    Bonjour,

    Je suis debutant en C#, merci de votre indulgence si ma question est triviale.

    J'ai lu dans mon manuel de C# (C# in a nutshell) qu'une classe peut avoir plusieurs methodes de meme nom tant que leurs arguments sont de types differents (chaque methode ayant donc une signature unique puisqu'une signature de methode est definie par le couple Nom + Type des arguments)
    On appelle cela la surcharge de methode.
    Plus exactement, une signature c'est nom + arguments + valeur de retour (bien qu'on ne puisse pas avoir deux signatures qui ne diffèrent que par leur valeur de retour).
    Citation Envoyé par powdaddy Voir le message
    J'imagine que c'est ce qui se passe par exemple pour la methode Console.WriteLine qui peut etre utilisee avec des arguments de type varies(Objet, Char, Decimal etc...). On a donc pas besoin d'appeler une methode differente pour chaque type different...
    Tout à fait!
    Citation Envoyé par powdaddy Voir le message
    Pensez vous que l'implementation de Console.WriteLine est bien ainsi faite (je ne pense pas qu'on puisse trouver le code source) ?
    Tout à fait pour ce qui est de l'implémentation du framework! Mais on peut trouver le code source du framework (ou le décompiler avec un outil tel que Reflector, IlSpy, JustDecompile, etc.)
    Citation Envoyé par powdaddy Voir le message
    Y a t'il d'autres facon d'implementer une methode qui puisse etre utilisee avec des parametres de type varies ? Je pensais a une implementation de methode qui prenne par exemple un argument de type 'var' (donc indefini) et qui en interne ferait des tests sur le type du parametre avec des typeof ou GetType pour ensuite, en fonction, retourner qqchose. Ca ne serait plus de la surcharge de methode puisqu'en interne je n'aurais qu'une seule methode definie avec un seule type - tres general- d'argument.
    Oui et non. Oui il est possible de procéder ainsi mais non pas avec var. var se base sur l'inférence de type et contrairement à ce que tu as mis le type "caché" par var n'est pas indéfini mais parfaitement connu à la compilation.
    Toutefois, ca peut fonctionner avec le mot dynamic ou tout simplement object

    Citation Envoyé par powdaddy Voir le message
    Quelle est la soluation d'implementation la plus standard/recommendee/intelligente... ?

    Merci !
    Tout dépend du besoin mais généralement, on préfère éviter les casts et par conséquent utiliser les surcharges

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Attention à var, il n'est pas indéfinis comme en php!
    A la compilation le var devient un objet bien concret (tu peux voir qu'apres affectation le compilateur t'engueule si tu veux mettre quelque chose d'autre).
    Pour ton idée il te suffit d'utiliser object, et ensuite tu peux effectivement tester le type réel de l'objet.
    Il me semble plus "simple" d'avoir plusieurs surcharge qu'une seule méthode qui fait tout et même le café. Que ce soit en terme d'implémentation ou en terme d'utilisation.
    Utiliser un type générique ca se fait, par contre c'est plutot en utilisant des interfaces.
    Enfin bref je vais pas beaucoup t'aider, mais je pense pas qu'il y ai de méthodes plus "standard/recommendee/intelligente", ca dépend du contexte et du besoin.

  4. #4
    Futur Membre du Club
    Inscrit en
    Septembre 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Merci pour vos reponses, rapides et precises.

  5. #5
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Pour compléter, un lien vers des explications sur le mot clé dynamic
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

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

Discussions similaires

  1. [1.x] surcharger la methode get
    Par bihman dans le forum Symfony
    Réponses: 20
    Dernier message: 18/11/2010, 12h03
  2. Comment surcharger la methode Render?
    Par mariejo dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/10/2010, 19h20
  3. "Surcharge" de methode
    Par benscasi dans le forum Langage
    Réponses: 3
    Dernier message: 09/03/2010, 20h47
  4. Réponses: 5
    Dernier message: 13/02/2007, 08h53
  5. [Deb] Syntax surcharge de methode
    Par Marc_3 dans le forum Débuter
    Réponses: 2
    Dernier message: 10/01/2006, 15h11

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