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

Langage Java Discussion :

Interface et implémentation de méthodes


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Interface et implémentation de méthodes
    Bonjour tout le monde . J'ai une question simple de débutant à poser . Imaginant une classe Chien ainsi qu'une classe Brebis , toutes les deux implémentant une interface animal .
    Avec une interface animal comme ceci .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface Animal {
     
    void setColor();
     
    }
    Maintenant , en travaillant sous éclipse , j’implémente la méthose setColor() dans Chien et dans Brebis . Le problème est que je ne veux pas les mêmes argument pour le chien et pour la brebis . Eclipse me dit qu'il faut que j'implemente la méthode sans argument comme dans l'interface animal . Je pourrais les rajouter dans l'interface mais comme les argument sont différents pour Chien et Brebis, il me faudrait créer 2 méthodes setColor() dans l'interface . Alors est que éclipse me dit n'importe quoi, ou alors que je doive en java implémenter la méthode avec exactement les mêmes arguments ? Si c'est le cas, ça limite fortement alors l’intérêt des interfaces à mon avis . J'ai aussi remarqué qu" eclipse dit la même chose pour les méthodes abstraites dans les classes abstraites . Moi je voudrai pouvoir redefinir les méthodes avec les arguments que je veux . Alors j'ai trouvé une solution, qui est d'utiliser un méthode avec un nombre d'arguments variables comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void setColor (String... args) ;
    le problème et que ça ne marche que pour un seul type d'argument . Je m'explique : imaginant que je veuille passer au chien 2 String et 1 int, alors que je veux passer à la brebis 2 String et 1 double . Je ne pourrais pas faire ceci, à moins d'avoir une méthode setColot qui prend en compte tout les types d'arguments voulu ( int,String, double ) et de passer des objets null en paramètres quant on a pas besoin . Exemple j'ai pas besoin de int pour la brebis . Je met un objet int null en argument . Mais bon je trouve ça pas très "propre ".

    Alors question, éclipse a t-il tort, ai je le droit de faire ceci en java ? Si non, je peux toujours utilisés les méthodes que j'ai trouvé (en italique souligné dans le texte) . Mais , soit elles sont pas pratique du tout et enlève l’intérêt des interfaces . Le but étant d'avoir des méthodes polymorphes . Soit elle sont pas "propres" et compliqués à mettre en place . Donc y a t il une autre méthode . Voila merci, si vous avez lu ce gros pavé , pas forcement très clair . Et merci d'avance si vous me répondez . Et un petit smiley pour clore le message :

  2. #2
    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
    Hello,

    Ben non, tu peux pas trop faire ça ni dans Java ni dans aucun langage à typage statique.

    Tu dis que ça enlève l'intérêt des interfaces, autant dire dans ce cas que l'intérêt d'une interface est de faire joli et ne servir à rien. L'intérêt d'une interface, c'est que si tu peux appeler des méthodes de cette interface, tu peux le faire avec n'importe quel objet qui l'implémente. Donc forcément les paramètres sont les mêmes bien sûr.

    Si ton interface avait d'autres méthodes, qui, elles, étaient communes et avaient les mêmes paramètres, on pourrait s'adapter.
    Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    interface Animal<C> {
      void setColor(C color);
    }
     
    public class Chien implements Animal<CouleurChien> {
      @Override
      public void setColor(CouleurChien couleur) { /*...*/}
    }
     
    public class Brebis implements Animal<CouleurBrebis> {
      @Override
      public void setColor(CouleurBrebis couleur) { /*...*/}
    }
    mais j'imagine que ce n'est pas ce que tu as en tête. Tu avais plutôt en tête que non, en fait le typage statique tu préfères t'en passer, n'est-ce pas ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Si je comprend bien , le typage statique, c'est quant on est obligé de déclarer, à chaque fois , le type des variables . Donc PHP n'est pas un language à typage statique ?

    La solution utilisé ici, est donc le type générique . Bon, ça résout une partie du problème . Mais alors si j'ai envie d'avoir 2 arguments pour Chien et 3 pour Brebis, ça ne marche plus . Faut il que je définisse deux méthodes setColor alors ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    interface Animal<C>{
     
    setColor(C couleur1,C couleur2, C couleur3);
    setColor(C couleur1,C couleur2);
     
    }
    Autre question,Je ne comprend pas trop l'intêret du type génerique, vu qu'on peut utiliser le type Object, qui lui englobe tout les autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setColor(Object couleur);

  4. #4
    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
    Citation Envoyé par MrMickey Voir le message
    Si je comprend bien , le typage statique, c'est quant on est obligé de déclarer, à chaque fois , le type des variables . Donc PHP n'est pas un language à typage statique ?
    Oui, tout à fait, exactement.

    Citation Envoyé par MrMickey Voir le message
    La solution utilisé ici, est donc le type générique . Bon, ça résout une partie du problème . Mais alors si j'ai envie d'avoir 2 arguments pour Chien et 3 pour Brebis, ça ne marche plus .
    Alors, l'astuce c'est que, le paramètre dans les deux cas, c'est pas le même. C'est une classe, et une classe que tu as choisi toi-même.
    Donc il y a pas d'histoire de combien de paramètre. Les trucs que tu veux passer à cette méthode, tu les mets tous dans la classe CouleurChien ou CouleurBrebis ou CouleurSanglier. Et là dans chacune de ces classes tu mets tout ce que tu veux, une deux propriétés, une trois propriétés, une soixante mille propriétés...

    Exemple :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    public class CouleurBrebis {
      public final int numeroCouleur;
     
      public CouleurBrebis(int numeroCouleur) {
        this.numeroCouleur = numeroCouleur;
      }
    }
     
    public class CouleurChien {
      public final List<String> couleursPelage;
     
      public CouleurChien(String... couleursPelage) {
        this.couleursPelage= Arrays.asList(couleursPelage);
      }
    }
     
    // et donc, ailleurs :
     
    Brebis brebis = new Brebis();
    brebis.setColor(new CouleurBrebis(7));
     
     
    Chien chien = new Chien();
    chien.setColor(new CouleurChien("blanc", "noir"));
    Les classes CouleurBrebis et CouleurChien ne contiennent pas la même chose et pas le même nombre de choses.
    C'est faisable. Après il ne faut le faire que quand ça sert à quelque chose, bien sûr.

    Citation Envoyé par MrMickey Voir le message
    Autre question,Je ne comprend pas trop l'intêret du type génerique, vu qu'on peut utiliser le type Object, qui lui englobe tout les autres :
    Oui, on s'en doute, puisque c'est typiquement là l'antagonisme entre typage statique et dynamique.
    En typage statique on demande au compilateur de vérifier qu'on passe pas des poires à un objet qui demande des pommes. Parce que si on le fait c'est qu'on s'est planté comme un gros jambon et on préfère que le compilateur nous le dise tout de suite, plutôt qu'on le découvre trois jours plus tard quand les cahiers de test s'aperçoivent que c'est n'importe quoi.
    En typage dynamique on préfère garder cette possibilité de foirer complètement son coup sans que personne nous le dise, mais en gagnant la liberté de pouvoir mettre aussi bien des fruits qu'une facture Amazon dans la même variable, et trier plus tard qu'est-ce qu'on fait entre quoi et quoi.

    Or, effectivement, en Java, la classe Object peut contenir n'importe quoi, et donc nous replace dans cette situation où le compilateur ne nous préviens pas quand on fait n'importe quoi. Une variable object peut contenir n'importe quoi, un nombre, un texte, le niveau 12 de Zelda ou le rasoir de mon grand-père. Et c'est un peu dommage quand on essaie de programmer un logiciel de compta.
    Or justement puisqu'on a choisi le langage Java, c'est exactement ce qu'on ne voulait pas faire.

    L'intérêt des génériques, c'est que certes tu peux indiquer ce que tu veux comme paramètre générique, mais ça c'est au moment où tu choisis ce que tu veux. Quand, plus tard, tu vas utiliser ce que tu avais choisi avant, là il faudra que les types utilisés correspondent aux types choisis.
    Autrement dit les génériques servent à faire en sorte que le compilateur vérifie que tu ne fais pas n'importe quoi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2015
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Alors, l'astuce c'est que, le paramètre dans les deux cas, c'est pas le même. C'est une classe, et une classe que tu as choisi toi-même.
    Donc il y a pas d'histoire de combien de paramètre. Les trucs que tu veux passer à cette méthode, tu les mets tous dans la classe CouleurChien ou CouleurBrebis ou CouleurSanglier. Et là dans chacune de ces classes tu mets tout ce que tu veux, une deux propriétés, une trois propriétés, une soixante mille propriétés...
    Niquel, comme solution, merci .


    Citation Envoyé par thelvin Voir le message
    L'intérêt des génériques, c'est que certes tu peux indiquer ce que tu veux comme paramètre générique, mais ça c'est au moment où tu choisis ce que tu veux. Quand, plus tard, tu vas utiliser ce que tu avais choisi avant, là il faudra que les types utilisés correspondent aux types choisis.
    Autrement dit les génériques servent à faire en sorte que le compilateur vérifie que tu ne fais pas n'importe quoi.
    Merci, pour l'explication.

    Allez je met en résolu . Excellent forum . Je ne regrette pas de m'être inscrit .On m'a très vite répondu .

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

Discussions similaires

  1. Interface et implémentation de méthodes
    Par greenduck dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 02/11/2014, 18h58
  2. Réponses: 4
    Dernier message: 14/07/2009, 18h11
  3. Réponses: 2
    Dernier message: 08/01/2006, 15h09
  4. Réponses: 6
    Dernier message: 27/07/2005, 09h06
  5. [Interface] Appeller toutes les méthodes héritées d'un class
    Par thibaut.d dans le forum Général Java
    Réponses: 4
    Dernier message: 25/01/2005, 08h42

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