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

 .NET Discussion :

Polymorphisme et interface#classes abstraites


Sujet :

.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Points : 112
    Points
    112
    Par défaut Polymorphisme et interface#classes abstraites
    Bonjour,

    je debute en .net et j'arrive pas à comprendre le polymorphisme

    j'ai bien cherché avant de poser la question et j'ai tester des exemples.
    des idées????
    merci d'avance
    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
    class A
    {
     public void affiche()
       {
          console.writeline("class A");
       }
    }
     
    class b:A
    {
    public new affiche()
      {
          console.writeline("class B");
      }
    }
    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
    class C
    {
    public virtual void affiche()
      {
          console.writeline("class C");
      }
    }
     
    class D:C
    {
    public override void affiche()
      {
          console.writeline("class D");
      }
     
    }

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Polymorphisme (Guide de programmation C#)

    http://msdn.microsoft.com/fr-fr/libr...52(VS.80).aspx

    En règle générale il faut éviter l'utilisation du "new" car tu remplaces la fonction de la classe de base par la fonction de la classe dérivée. Je te conseille plutôt de déclarer la fonction de la classe de base en virtuel et de l'overrider dans la classe dérivée

    Bien :

    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
    class C
    {
    public virtual void affiche()
    {
    console.writeline("class C");
    }
    }
     
    class D:C
    {
    public override void affiche()
    {
    console.writeline("class D");
    }
     
    }
    Pas bien :

    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
    class A
    {
    public void affiche()
    {
    console.writeline("class A");
    }
    }
     
    class b:A
    {
    public new affcihe()
    {
    console.writeline("class B");
    }
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Points : 112
    Points
    112
    Par défaut
    merci pour le lien,
    je suis passé par là mais j'ai pas compris grand chose,
    polymorphisme: traduction plusieurs formes

    1.donc une methode peut avoir plusieurs formes.
    pour l'exemple la methode affiche() peut avoir plusieurs formes.
    mais c'est quoi Intérêt?????????
    pour la classe A la methode affiche() va afficher par exemple ("hi");
    pour la classe B:A la methode affiche() va afficher par exemple ("bye");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A test= new A();
    test.affiche(); //"hi"
     B test1= new B();
    test1.affiche(); //"bye"
    test=(A)test1;
    test.affiche(); //"bye"
    pourquoi?

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    Tu as toutes les explications dans MSDN, et avec des exemples.

    pour l'exemple la methode affiche() peut avoir plusieurs formes.
    mais c'est quoi Intérêt?????????
    L'intérêt c'est d'avoir des objets spécialisés, qui ont leur spécificités dans leur comportement. Par exemple, la méthode ToString() du framework donne une représentation sous forme de chaîne d'un objet. Si tu crées une classe Personne, tu voudras pas le comportement par défaut de ToString mais tu voudras qu'elle t'affiche le nom et le prénom.

    J'ai débuté aussi en C# il y a pas longtemps et j'ai écrit un tout petit source pour apprendre à utiliser ce genre de chose, ça devrait te permettre de comprendre :
    http://www.developpez.net/forums/d87...e-debuter-poo/

    Pour le dernier exemple que tu donnes c'est si la méthode "affiche" de B est déclarée en override, c'est-à-dire qu'elle remplace la méthode de A. Ca te permet de déclarer que des objets A mais d'instancier n'importe quel objet dérivé de A, et de ne pas avoir à déclarer des B, C, etc...

    Si tu déclares la méthode en "new", la méthode ne remplace plus celle qui est déclarée dans la classe mère. Il faut donc déclarer un objet B pour l'utiliser. Tu utilises new si la méthode dans la classe dérivée a le même nom que dans la classe mère mais qu'elle n'a rien à voir (faut être tordu )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    A[] objets = new A[] {new B(),new C(),new D()};
    foreach (A objet_a in objets)
      {
      //méthodes affiche de B, C, D si elle est sont déclarées en override
      objet_a.affiche(); 
      }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 433
    Points : 112
    Points
    112
    Par défaut
    Pour la méthode ToString() du framework c'est une methode virtual qu'on va la redefinir aprés en utilisant le keyword override.
    c'est la redefinition des methodes.
    mais ce que me derange et j'arrive pas à comprendre c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    classeMere a = new classefille();
    a.affiche();// il va faire appel à la methode affiche de class fille
    pourquoi et c'est quoi le but?
    et pourtant on a fait un cast implicite la classefille qui au meme temps une classemere.
    du coup il fallait appeller la methode affiche de classMere.

    j'arrive pas à avancer sur ce point

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Je pense qu'il te faut un cours sur la programmation objet si tu veux progresser. Tu peux regarder le lien ci-dessous et/ou te procurer un livre sur le sujet

    http://hdd34.developpez.com/cours/artpoo/

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour la méthode ToString() du framework c'est une methode virtual qu'on va la redefinir aprés en utilisant le keyword override.
    c'est la redefinition des methodes.
    mais ce que me derange et j'arrive pas à comprendre c'est:
    Tu laisses entendre que j'ai pas répondu à ta question alors que justement c'est exactement le même sujet.

    classeMere a = new classefille();
    a.affiche();// il va faire appel à la methode affiche de class fille

    pourquoi et c'est quoi le but???????????????????
    Justement la redéfinition de méthode n'aurait aucun intérêt sans ce comportement, ou du moins peu d'intérêt puisqu'il faudrait faire du transtypage (conversion de type).

    Le but il est dans mon code précédent. Est-ce que tu l'as compris ? La réponse à ta question elle tient dans mes 3 lignes de code, puisque sans le polymorphisme tu ne pourrais pas le faire.

    En résumé le but il est de manipuler des variantes de l'objet A, en bénéficiant des spécificités de chaque variante et sans savoir si en fait c'est un objet B, un objet C, etc...

    L'explication est aussi dans le cours que matdur t'as mis en lien:
    Le polymorphisme, en d'autres termes, est donc la capacité du système à choisir dynamiquement la méthode qui correspond au type réel de l'objet en cours. Ainsi, si l'on considère un objet Véhicule et ses descendants Bateau, Avion, Voiture possédant tous une méthode Avancer, le système appellera la fonction Avancer spécifique suivant que le véhicule est un Bateau, un Avion ou bien une Voiture.
    Dans mon code source que je t'ai mis en lien (et qui te permettrait de comprendre, j'insiste), la classe Plan affiche ses objets (cercle, droite, etc...), mais sans connaître la nature réelle de chaque objet (cercle, droite, etc...) Or c'est la nature réelle de l'objet qui va déterminer la façon dont il s'affiche (grâce à la redéfinition de fonction).

Discussions similaires

  1. Interface - classe abstraite
    Par cellk dans le forum C#
    Réponses: 2
    Dernier message: 05/11/2009, 08h37
  2. que choisir : interface, classe abstraite?
    Par kaibaa dans le forum Débuter
    Réponses: 4
    Dernier message: 04/11/2009, 23h19
  3. Interfaces/Classes abstraites et méthodes statiques
    Par Zakapatul dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/01/2009, 14h38
  4. polymorphisme, pointeurs et classes abstraites
    Par legend666 dans le forum C++
    Réponses: 10
    Dernier message: 02/11/2005, 16h44
  5. Réponses: 6
    Dernier message: 27/07/2005, 09h06

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