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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    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

  2. #2
    Expert confirmé
    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
    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
    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
    Membre éclairé 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
    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 ?

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    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é ?

  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
    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 éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

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

  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 : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    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
    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 : 43
    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
    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

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