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

avec Java Discussion :

Interface polymorphisme apprendre


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Technicien Informatique
    Inscrit en
    Février 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 187
    Points : 89
    Points
    89
    Par défaut Interface polymorphisme apprendre
    Bonjour à tous !

    Pour apprendre Java je suis entrain d'essayer de comprendre la notion de polymorphisme en Java et de la mettre en œuvre. Si j'ai bien compris les choses ... le polymorphisme peut être généré par le biais de l'héritage , des interfaces, ou de leurs utilisations cumulées ...

    J'ai donc crée une interface nommée Véhicule avec des méthodes rouler et freiner qu'il faut définir lorsque l'on souhaite les utiliser. La classe Auto implémente l'interface Vehicule. La classe Velo implémente elle aussi l'interface Véhicule.
    En théorie, je devrais pouvoir ainsi disposer de comportements différents pour chaque objet ... mais je coince sur la partie Lanceur qui comprend la méthode Main et je ne parviens pas à trouver la bonne syntaxe.

    Je vous remercie pour vos conseils et vos idées.

    Jean-Marc


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Vehicule  {
     public void rouler();
     public void freiner();


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class Auto implements Vehicule {
         public Auto(Vehicule a) 
     
    System.out.println("Je suis une  auto");
        }
     
       public void rouler(){System.out.println("Je  suis une auto je roule vite");}
        public void  freiner(){System.out.println("Je suis une auto je freine  fort");}
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Velo implements Vehicule {
        public Velo(Vehicule v) {
            System.out.println("Je suis un vélo");
        }
     
        public void rouler(){System.out.println("Je suis un velo je roule doucement");}
        public void freiner(){System.out.println("Je suis velo je freine lentement");}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public class Lanceur {  
      public static void main ( String  args[]){
       // Auto a= new Vehicule (new  Auto());
       // Velo v=new Vehicule(new  Velo());  
     
    }
    }
    Jean Marc

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    Euh, je comprends pas très bien le problème "syntaxe de la fonction main" ?
    Pour pouvoir lancer ton application, ton doit définir une classe qui contient une fonction "main" (comme tu l'as fait avec la classe Lanceur) et déclarer cette classe comme classe principale de ton programme.

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    On ne peut pas instancier une interface, seulement une classe. Donc pour instancier un objet de classe Auto, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Auto auto = new Auto();
    Ce code ne va pas fonctionner avec ta déclaration du constructeur de la classe Auto, parce que tu as mis un argument de type Vehicule. On ne peut donc pas créer de Auto, ou de Velo, sans avoir créer un Vehicule avant (le type de l'argument), ce qui ne sert pas à grand chose.

    Fais tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Auto implements Vehicule {
         public Auto() 
             System.out.println("Je suis une  auto");
        }
     
       public void rouler(){System.out.println("Je  suis une auto je roule vite");}
        public void  freiner(){System.out.println("Je suis une auto je freine  fort");}
    }
    Ensuite, les interfaces ne contribuent pas vraiment en-soi à la notion de polymorphisme : elles définissent surtout un contrat (des méthodes qu'on impose avec des signatures (des paramètres) qu'on impose : dans ton cas, Vehicule impose une méthode rouler() et une méthode freiner()).

    Par exemple, avec cette classe,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Exemple {
     
       public void faire(String s) {
          System.out.println("Je fais un truc");
       }
     
    }
    dans ce cas tu as un polymorphisme (on dit qu'on surcharge la méthode faire) (ne pas oublier que par héritage Exemple1 a la méthode faire(String) de Exemple)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Exemple1 extends Exemple {
     
     
       public void faire(int i) {
          System.out.println("Je fais un truc");
       }
     
    }

    Ici, tu as un polymorphisme d'héritage (on dit qu'on redéfinit la méthode faire (ou qu'on la spécialise)) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Exemple2 extends Exemple {
     
       public void faire(String s) {
          System.out.println("Je fais un autre truc");
       }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre régulier
    Profil pro
    Technicien Informatique
    Inscrit en
    Février 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 187
    Points : 89
    Points
    89
    Par défaut Interface polymorphisme apprentissage
    OUI effectivement comme j'avais commenté les deux lignes me posant soucis ...
    en fait ce sont les deux lignes suivantes qui me posent soucis

    L'objet Auto devrait disposer en paramètre de l'interface Vehicule a et l'objet Velo
    de l'interface véhicule v ... mais je coince sur la syntaxe pour parvenir à mes fins

    C'est à dire que l'objet a et l'objet b utilisent les mêmes méthodes mais avec des résultats
    distincts

    En souhaitant ... que cela soit plus clair


    Avec mes remerciements !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    
     Auto a= new Vehicule (new  Auto());
       Velo v=new Vehicule(new  Velo()); 
    Jean Marc

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Une interface n'est pas un paramètre. Donc c'est impossible que "des objets disposent en paramètre de l'interface Véhicule" ou je ne sais quoi.


    Oublie ce que tu étais en train de faire, brûle-le et jette-le à la poubelle. Fais ce que dit joel.drigo. Le polymorphisme ça marche comme ça, pas autrement.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier
    Profil pro
    Technicien Informatique
    Inscrit en
    Février 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien Informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 187
    Points : 89
    Points
    89
    Par défaut Interface Polymorphisme apprendre
    Bonjour à tous Merci pour vos réponses !

    Je pensais également que cela n'était pas possible jusqu'à ce que je lise cette article
    http://fr.wikibooks.org/wiki/Program...ava/Interfaces .. le contenu de l'article serait il erroné ?
    C'est la partie du code ci dessous qui me pose soucis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    Personne p = new Personne();
    p.conduire(new Velo()); //comme la méthode attend un Vehicule en argument, on peut passer tout objet implémentant cette interface.
    p.conduire(new Auto());
    Jean Marc

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il y a plusieurs types de polymorphisme : dans cet article, je dirais que c'est un mauvais exemple de polymorphisme par sous-typage. Il donne l'impression qu'on ne peut le faire que par Inteface et que c'est la notion d'Interface qui le permet. La notion d'Interface est une façon de pouvoir utiliser des instances de plusieurs classes différentes comme paramètre d'une méthode, si ce paramètre est typé par l'interface et que les classes implémentent cette interface. On peut faire du polymorphisme par sous-type avec des classes abstraites ou des classes concrètes. L'interface est avant tout pour indiquer les méthodes que l'on veut pouvoir appeler sur une instance (accessoirement, on peut faire quelque chose qui ressemble à du multihéritage (parce qu'on peut implémenter plusieurs interfaces dans une classe), mais l'interface n'est pas ce qui permet de faire du multihéritage non plus, puisqu'on ne peut pas vraiment en faire).

    Dans ton cas, on pourrait avoir une méthode public void garer(Vehicule vehicule) qui pourrait manipuler des instances de Auto et Velo. Comme la méthode conduire(Vehicule) que tu cites.

    Mais cet article n'évoque pas les syntaxes que tu as postées dans ton message (avec un paramètre de type Vehicule, ou une instanciation de type new Vehicule().

    A noter qu'il y a aussi un polymorphisme, dit paramétrique (plusieurs méthodes de signatures différentes (en nombre et en type) dans une même classe).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Comme déjà dit, l'interface est un contrat, applicable à de nombreuses classes différentes.
    L'intérêt est justement de voir un objet par son contrat et non par sa classe.

    D'après les bases de ton exercice, je dirais que l'interface est bien placée, elle s'occupe de définir un contrat applicable à tous les véhicules et dont la "mise en oeuvre" est très spécifique à chaque classe qui l'étend.
    Pour le lanceur, si tu veux voir tes objets sous l'aspect de leur contrat, il faudrait faire quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Lanceur
    {
       Vehicule vehicule1 = new Auto();
       Vehicule vehicule2 = new Velo();
    ...
       vehicule1.freiner();
       vehicule2.rouler();
    }
    Je prends souvent l'exemple d'un contrôleur de trafic, il se fiche de savoir qu'il gère des camions, voitures, motos, vélos... lui veut juste réguler le trafic et donc agir sur l'ensemble des véhicules sans avoir à se soucier du comment il vont faire pour "rouler" ou "freiner"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/06/2009, 18h33
  2. Réponses: 6
    Dernier message: 08/02/2008, 14h58
  3. Réponses: 6
    Dernier message: 24/08/2006, 14h33
  4. [Language] polymorphisme, interface ...
    Par Ikit dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2005, 11h39

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