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 :

[Conception] Méthode avec interface en paramètre


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 34
    Points
    34
    Par défaut [Conception] Méthode avec interface en paramètre
    Bonjour,

    Je voudrais connaître l'intérêt et le principe de création et d'utilisation de méthodes qui prennent en paramètre une interface.
    J'ai entendu que ça permettait d'utiliser des méthodes sans en connaître leurs implémentations. Il paraît aussi qu'on utilise bcp les interfaces (notamment les listeners) en paramètre de méthodes lorsqu'on développe des IHM.
    Donc pouvez-vous me donner un ou plusieurs exemples ? Merci.

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    ce que tu as entendu était correct. Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public void traiter(List l){
       ...
    }
    ici on passe une interface en paramètre : List. Cette façon de coder te permet de traiter une liste d'objet, peu importe l'implémentation de cette liste (ArrayList, LinkedList etc.). L'interface list te garanti que les méthodes de base sont implémentées (get(int i), size() etc.).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Autre exemple, Tu peux avoir une interface qui te permet d'accéder à une base de donnée sans savoir à quel type de base tu accedes. L'interet dans ce cas là c'est que tu peux dans l'avenir changer de base de donnée sans changé le code. tu n'as que la classe d'acces à modifier pas ton appli complete.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    Par défaut
    Autre exemple, celui des listener, là c'est toi qui fourni l'implémentation d'une interface pour être rappelé: quand tu implémente ActionListener, et que tu ajoute l'instance de ta classe dans les listeners de l'objet approprié, tu sait que tu va être rappellé sur actionPerformed(ActionEvent e)

    Idem pour Runnable et run() que tu utilise sur new Thread(new MaClassRunnable())

  5. #5
    Membre régulier Avatar de kerinel
    Profil pro
    Inscrit en
    Février 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 103
    Points : 107
    Points
    107
    Par défaut
    Les interfaces sont une sorte de "contrat" passé entre le compilateur et la classe qui l'implémente.
    Lorsque tu déclares qu'une classe implémente une interface, tu assures le compilateur que la classe aura toutes les méthodes prévues pour réaliser ce que prévoit l'interface (d'ailleurs si tu le fais pas il te jette ).
    Mais ta classe te permettra aussi de faire d'autre chose. L'interet de l'interface est de ne pas avoir à faire d'heritage multiple. "L'inconvénient" est qu'il te revient d'écrire le corps de la méthode. Mais bon de toute façon c'est bien à toi de décider ce que tu dois faire quand la souris est clickée ou qu'un bouton est activé (par exemple).

    De l'autre coté, lorsque tu déclares que une méthode prend en argument une classe implémentant l'interface, tu assures le compilateur que l'objet que tu passeras en argument sauras répondre à tous les appels de méthodes (mousePressed, mouseClicked.. etc... pour l'interface MouseListener par exemple), et ce indépendamment de ce pourquoi est prévu la classe.

    bon code,
    kerinel

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Merci pour ttes vos réponses.
    Je comprend globalement ce que vous affirmez. Seulement, ça serait encore plus clair pour moi si vous pouviez illustrer avec des exemples contenant des bouts de code. Je serai vraiment ravi d'avoir une illustration avec code pour le cas des listeners (cité par deltree) et de l'accès à une base de donnée (cité par gcorbineau).
    Aussi je ne visualise pas bien comment est faite l'organisation des fichiers. Doit-on séparer le fichier f1 contenant l'interface i1 du fichier f2 qui contient la méthode m1 prenant en paramètre cette interface i1. Dans quel fichier sera appelé la méthode m1 et dans quel fichier va-t-on instancier la classe implémentant l'interface i1 ?
    En gros, j'aurai besoin d'un petit exemple.
    Merci bien.

  7. #7
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Bonjour

    Voici un exemple simple

    Une interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    interface Forme {
    public void dessiner();
    }
    Quelque classes de forme géométrique qui implémente cette interface;
    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
    25
     
    class Carre implements Forme{
    //...
    public void dessiner(){  // méthode implémenté de l'interface Forme
    // ici, il y a le code qui dessine un carré
    System.out.println("Dessine un carre");
    }
    }
     
    class Cercle implements Forme{
    //...
    public void dessiner(){
    //code qui dessine un cercle
    System.out.println("Dessine un cercle");
     
    }
    }
     
    class Triangle implements Forme{
    //...
    public void dessiner(){
    //code qui dessine un triangle
    System.out.println("Dessine un triangle");
    }
    }
    Une classe pour tester le tout

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    import java.util.ArrayList;
    public class TestForme{
     
    // une collection qui contient des Objects de type Forme.
    // Cela peut être un Carré, un Cercle ou un Triangle car ces classes
    // impléments l'interface Forme. Donc, ces classes sont aussi de Type Forme.
    ArrayList<Forme> formeDifferente = new ArrayList<Forme>(30);
     
    public TestForme(){
     
    // crée 20 formes aléatoire
    // et les ajoute au arrayList
    // en utilisant la méthode ajouter(Forme uneForme)
    for (int i = 0; i < 20; i++){
     
    double ran = Math.random() * 3;
     
    if (ran > 2 ){
    ajouter(new Carre()); 
    }
    else if (ran > 1) {
    ajouter(new Cercle());
    }
    else if (ran > 0){
    ajouter(new Triangle());
    }
     
    }
    dessinerLesFormes();
    }
     
     
    // une méthode avec l'interface Forme en paramètre.
    public void ajouter(Forme uneForme){
    formeDifferente.add(uneForme);
    }
     
    public void dessinerLesFormes(){
    // dessiner les 20 formes
    // ce n'est qu'une sortie à la console mais, on comprend l'idée...
    for (Forme forme : formeDifferente){
    forme.dessiner(); // l'appel sera la méthode dessiner() de la classe corresspondante
    }
    }
     
    public static void main(String arg[]){
    new TestForme();
    }
     
    }
    Ce qui faut retenir de cet exemple est dans la méthode dessinerLesFormes():
    for (Forme forme : formeDifferente){
    forme.dessiner();
    }
    Chaque Object de la list (Cercle, Carre, Triangle) ont implémenté la méthode dessiner() de facon différente. C'est cette méthode qui s'exécute.

    Aussi je ne visualise pas bien comment est faite l'organisation des fichiers.
    ...
    Dans l'exemple, tout peut tenir dans un seul fichier à condition qu'il soit nommé TestForme.java car c'est la class public. Tout dépend de la accessibilité que l'on veut donner a une classe. Ainsi, toutes les autres classes de l'exemple seront accessible seulement par les classes du même package. Pour qu'elles soient visible de l'extérieure, elles doivent être déclaré public et dans des fichiers séparé portant le même nom.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Merci jibbi pour ttes ces explications.
    Je ne comprend pas ta méthode ajouter dont la signature est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void ajouter(Forme uneForme)
    Alors que quand tu fait appel à cette méthode, tu ne passe pas en paramètre une interface mais new Carre(), new Cercle et new Triangle() qui sont des classes implémentant l'interface Forme.

    Sinon petit détail syntaxique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Forme forme : formeDifferente)
    est-ce bien valable en Java ? ou faut-il utiliser qch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int i = 0; formeDifferente.size() ;i++)

  9. #9
    Membre actif Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Points : 205
    Points
    205
    Par défaut
    Je ne comprend pas ta méthode ajouter dont la signature est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void ajouter(Forme uneForme)
    Alors que quand tu fait appel à cette méthode, tu ne passe pas en paramètre une interface mais new Carre(), new Cercle et new Triangle() qui sont des classes implémentant l'interface Forme.
    La méthode ajouter(Frome uneForme) prend un Objet de Type Forme, ici les classes Carre, Cercle et Triangle sont aussi des Formes puisqu'elles implémentent cette interface.

    Sinon petit détail syntaxique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (Forme forme : formeDifferente)
    est-ce bien valable en Java ? ou faut-il utiliser qch comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(int i = 0; formeDifferente.size() ;i++)
    C'est équivalent. On appel se type de boucle For-each loop qui permet de racourcir/éclaicir le code et éviter une erreur dans la manipulation d'une variable. Tous les détails ici. Disponible depuis JAVA 5

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 40
    Points : 34
    Points
    34
    Par défaut
    Ok je comprend mieux maintenant.
    Merci bcp.

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

Discussions similaires

  1. appel d'une méthode avec plusieurs paramètres
    Par soujava dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/05/2008, 23h30
  2. Passage d'une interface en paramètre de méthode COM
    Par sylvain.cool dans le forum C++
    Réponses: 11
    Dernier message: 18/04/2008, 14h15
  3. Réponses: 1
    Dernier message: 28/01/2008, 14h49
  4. appeler une méthode avec paramètre dans une page JSP
    Par javasmif dans le forum Struts 2
    Réponses: 1
    Dernier message: 06/12/2007, 10h48
  5. méthode avec paramètre
    Par MaitrePylos dans le forum Ruby on Rails
    Réponses: 9
    Dernier message: 21/06/2007, 09h26

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