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 :

polymorphisme et paramètre par référence.


Sujet :

C#

  1. #1
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut polymorphisme et paramètre par référence.
    Pourquoi ne peut-on pas tirer partis du polymorphisme dans le cas des méthodes avec des paramètres par référence.
    Par exemple le code ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            static void Main(string[] args)
            {
                string aa = "fdklsm";
                AMethod(ref aa);
            }
     
            public static void AMethod(ref object obj)
            {
            }
    Pourtant l'équivalent en VB.net est possible. Pourquoi sur ce point c# est moins fort que VB ?

    Merci d'avance pour vos éclaircissements.

    mathmax
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Et pourquoi pas ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    static void Main(string[] args)
            {
                object aa = "fdklsm";
                AMethod(ref aa);
            }
     
            public static void AMethod(ref object obj)
            {
            }

  3. #3
    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
    Qu'appelles tu polymorphisme ? Dans ton exemple, je n'en vois pas.
    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

  4. #4
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    parce que si je veux utiliser aa en tant que string par la suite, je suis obligé de faire un cast.

    Pourquoi est-ce que c# impose d'avoir exactement le type du paramètre par référence de la méthode appelée et non un type hérité ?
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  5. #5
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par SaumonAgile Voir le message
    Qu'appelles tu polymorphisme ? Dans ton exemple, je n'en vois pas.
    Voilà ici
    En informatique, le polymorphisme est l'idée d'autoriser le même code à être utilisé avec différents types, ce qui permet des implémentations plus abstraites et générales.
    Mais moi aussi, je pensais que le polymorphisme, c'est des méthodes avec le même nom mais une signature différente, pour appliquer un traitement selon le type en paramétre...


    maa: Je ne connais pas le VB, une fonction ne peut être nommé qu'en une fois en VB ?

  6. #6
    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
    Citation Envoyé par maa Voir le message
    parce que si je veux utiliser aa en tant que string par la suite, je suis obligé de faire un cast.

    Pourquoi est-ce que c# impose d'avoir exactement le type du paramètre par référence de la méthode appelée et non un type hérité ?
    Je suis tenté de te répondre "parce que c'est comme ça", mais je pense qu'il s'agit tout bêtement d'une limitation/contrainte du langage, après que ce soit une contrainte technique, un oubli, ou de la paresse de la part des concepteurs, le résultat est le même.

    Après tout, si C# était un langage parfait, on ne s'embêterait plus à parler français
    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

  7. #7
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Non je refuse de croire que c# est moins bien que VB
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  8. #8
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Pourquoi s'embéter avec "object" ? Les generics sont là pour ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    static void Main(string[] args)
    {
        string aa = "fdklsm";
        AMethod(ref aa);
    }
     
    public static void AMethod<T>(ref T obj)
    {
        Console.WriteLine(obj.ToString());
    }
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  9. #9
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Oui entièrement d'accord. Le problème c'est que j'utilise des classes d'un projet VB qui n'est pas développé par moi.
    C'est l'enfer, il multiplie les paramètres optionnels et les demande tous par référence.

    Du coup pour chaque paramètre optionnel, je dois :
    - déclarer un objet 1 du type du paramètre en l'instanciant avec la valeur par défaut qui est donné au niveau de la méthode VB,
    - déclarer un objet 2 dont la référence est égale à objet 1 mais casté dans le type que je souhaite,
    - utiliser l'objet 1 dans les paramètre de la méthode concernée avec le mot clé ref.
    Tout ça pour des paramètres optionnels qui ne servent à rien...
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  10. #10
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par maa Voir le message
    Non je refuse de croire que c# est moins bien que VB
    Et tu as bien raison
    D'ailleurs ce n'est pas une faiblesse de C# mais de Visual Basic . Je m'explique...

    En fait Visual Basic te laisse faire ça parce qu'il est très permissif au niveau des conversions implicites de type... mais ce n'est pas parce que ça compile que tu ne peux pas avoir d'erreur à l'exécution ! La preuve en image... enfin, en code

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        Sub Main()
            Dim i As Integer
            MyMethod(i)
            Console.WriteLine(i)
        End Sub
     
        Sub MyMethod(ByRef x As Object)
            x = Guid.NewGuid
        End Sub
    Ce code compile, mais plante... alors que si tu mets "Option Strict On", comme par hasard, ça ne compile plus, on a l'erreur suivante :
    Option Strict On disallows narrowing from type 'Object' to type 'Integer' in copying the value of 'ByRef' parameter 'x' back to the matching argument.
    En fait, si tu déclares une variable de type T, et que tu la passes à une méthode qui prend un Object par référence, il est possible (et même probable) que la méthode assigne une valeur à ta variable. Et rien ne garantit que ce sera une valeur de type T ! Tu sais juste que ce sera une classe dérivée de Object, mais pas forcément convertible en T... dans l'exemple ci-dessus un Guid n'est pas convertible en Integer.

    Donc en fait c'est parfaitement logique que C# ne t'autorise pas à faire ça, et c'est encore une preuve que l'Option Strict devrait être activée par défaut en VB

  11. #11
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Ok, mais par contre c'est dômmage de ne pas avoir de paramètres optionnels en c#. Pourquoi un tel choix ?
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Parce que sinon ce serai du VB ?
    Personnellement je trouve qu'il vaut mieux être trop strict que pas assez, celà évite des crash difficiles à corriger. Après, c'est ainsi que le langage a été crée ...

  13. #13
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Je pense que c'est parce que ça peut causer des conflits avec des surcharges de méthode.
    Pour reproduire le même comportement, tu peux toujours créer une surchage sans le paramètre optionel, et passer la valeur par défaut à la surcharge qui accepte ce paramètre. C'est un peu plus long à écrire mais au moins ça évite les mauvaises surprises. D'ailleurs je soupçonne que c'est ce que fait le compilateur VB en interne...

  14. #14
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Quel genre de mauvaises surprises ?
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  15. #15
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    mmm... j'ai pas d'idée en tête là
    f'est comme fa et puis f'est tout

  16. #16
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    En effet, je trouve un cas qui peut facilement induire en erreur :

    Considérons ces 2 méthodes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Sub MySub(ByVal param1 As List(Of String))
            Console.WriteLine(param1(0))
        End Sub
     
        Sub MySub(ByVal param1 As IList, Optional ByVal param2 As Boolean = True)
            Console.WriteLine(param1(1))
        End Sub
    Un utilisateur va appeler la méthode en utilisant la 2ème surcharge comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Dim list As New List(Of String)
            list.Add("1 er élément")
            list.Add("2 nd élément")
            MySub(list, True)
    Puis, plus tard il se rend compte que le 2ème paramètre est inutile. Il décide de le supprimer et il se rend compte alors que l'affichage dans la console n'est pas le même...

    Je suis d'accord, il vaut mieux être plus rigoureux a l'écriture du code et la compilation si ça peut éviter des mauvaises surprise à l'exécution.
    Par contre quand on utilise des classe VB depuis du code C#, ça devient vite galère (pour les raisons cité plus haut). On le voit déjà quand on développe un projet VSTO.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

  17. #17
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ben voilà, t'as trouvé l'exemple tout seul
    Il y a aussi le cas des méthodes avec un nombre variable de paramètres (params en C#, ParamArray en VB) qui pose problème.

    Par contre quand on utilise des classe VB depuis du code C#, ça devient vite galère (pour les raisons cité plus haut)
    [MODE=troll]
    Voilà pourquoi il ne faut pas utiliser Visual Basic du tout
    [/MODE]
    Non, sérieusement, ça fait longtemps que je pense que c'est un mauvais langage et que je ne l'utilise plus du tout... mais bon, des fois on n'a pas le choix.

  18. #18
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Attention au troll, en parlant ainsi tu risque de te faire attaquer par tous les VBistes du forum
    En général, VB parrait comme un langage plus simple à utiliser avec moins de contraintes que le C# et qu'il est donc plus facile d'aprendre. Après, celà n'est en général qu'une questions de gouts ...

  19. #19
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Ben justement, je trouve pas ça tellement plus facile d'apprendre avec un langage qui te laisse faire plein d'erreurs... mais bon, ça doit venir du fait que Basic (tout court) a longtemps été le langage des débutants, alors tout le monde s'imagine que VB.NET est plus facile que C#. Pourtant la principale différence tient à la syntaxe, qui est finalement assez similaire (plus ou moins les mêmes mots-clés et structures de contrôle).

  20. #20
    maa
    maa est déconnecté
    Membre actif
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Points : 288
    Points
    288
    Par défaut
    Après je trouve que VB est quand même mieux intégrer à Visual Studio. L'intellisens, la correction des erreurs sans avoir à recompiler, le fait de pouvoir définir des namespace par défaut au projet, etc... sont autant de fonctionnalités que l'on aimerait bien avoir en C#.
    ****************************************

    - I don’t write plumbing code anymore
    - I use PostSharp
    - And you?


    ****************************************

Discussions similaires

  1. Passage de paramètres par référence
    Par margagn dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/05/2007, 23h08
  2. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  3. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  4. [C#] Envoie des paramètres par référence
    Par efficks dans le forum C#
    Réponses: 4
    Dernier message: 29/11/2005, 23h53
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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