Précédent   Forum des professionnels en informatique > Java > Général Java > Langage

Langage Langage Java, syntaxe, POO, conventions . Avant de poster -> FAQ Java

Réponse
 
Outils de la discussion
Vieux 08/12/2004, 16h08   #1 (permalink)
Invité de passage
 
Date d'inscription: décembre 2004
Messages: 4
Par défaut [Conception] Passer une fonction en paramètre

Bonjour,

j'aimerai savoir si c'est possible de passer une fonction comme argument comme en C. merci
[ Modéré par vedaer ]
-> Ajout du tag dans le titre
[ Merci de respecter les Règles du Forum ]
pejay est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 16h19   #2 (permalink)
Responsable Eclipse
 
Avatar de xavlours
 
Date d'inscription: février 2004
Localisation: La tête en l'air, les pieds sur terre (à Adelaide, Australie).
Messages: 1 862
Par défaut

Il me semble fortement que non, sauf dans le cas exceptionnel de la réflexion.
Pour passer une fonction en parametre (par exemple actionPerformed() ) il faut écrire :
  • Une interface qui donne le nom de ta fonction (par exemple actionListener)
    Une classe qui implémente cette interface : elle donne le corps de la fonction
    Tu passes un objet de cette classe en paramètre
Exemple : pour les boutons de l'interface graphique, on veut spécifier au bouton quelle fonction exécuter quand on clique dessus :
Code :
//l'interface existe déja, elle s'appelle ActionListener, et elle définit une seule méthode :
//public void actionPerformed(ActionEvent e);
 
public class MaClasse implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("Vous avez cliqué sur le bouton !!");
    }
}
 
public class ClasseUtilisantUnBouton {
 
....
        monBouton.addActionListener(new MaClasse());
....
}
Le bouton ira chercher tout seul la methode (= fonction) actionPerformed dans l'objet que tu lui as donné.
Ai-je été clair ?
xavlours est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 16h28   #3 (permalink)
Membre du Club
 
Date d'inscription: décembre 2004
Messages: 81
Par défaut

Tu veux plutôt dire méthode ? Je pense que oui puisqu'il existe la classe Method (java.lang.reflect.Method). Ceci dit, la "logique java" veut qu'on ne fait jamais ce genre de chose en pratique (contrairement au langage C). Je sais pas ce que tu veux faire, mais est-ce qu'une interface contenant ta méthode à appeller ne résoudrait pas ton problème ?

Exemple :

Code :
public interface Executable {
  public void execute() ;
}
Et tu passes un Executable en paramètre :

Code :
public void uneFonction(Executable maFonctionParametre) { ... }
Enfin, je pense que tu saisies l'idée ?
plopinou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 16h29   #4 (permalink)
Nouveau membre du Club
 
Date d'inscription: novembre 2004
Messages: 63
Par défaut bouhhhhh

bouhhhhhhhhh du C, oust le C !!!!!!!

pk diable vouloir faire ça en objet ??? je suis curieux...
__________________
--
Powered by EPITA
Powered by IUT PARIS V
waddle est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 16h52   #5 (permalink)
Nouveau membre du Club
 
Date d'inscription: avril 2003
Messages: 63
Par défaut

C'est possible en passant par la classe Class et les classes qui en dépendent : Method, Attribute, etc.
Grosso modo, il faut
- récupérer un objet représentant ta classe java (de classe Class, à ne pas confondre avec une instance de ta classe) :
Code :
 
Class maClasse = Class.forName("NomDeMaClasse");
 
(il y a un try catch autour normalement)
- récupérer la méthode qui t'intéresse en faisant
Code :
 
Method maMethode = maClasse.getMethod("nomMethode", parameters);
 
où parameters est un tableau d'objets définissant le squelette de ta méthode.
- et enfin tu pourras l'évoquer en faisant
Code :
 
maMethode.invoke(instance, parameters);
 
où "instance" est l'instance de la classe sur laquelle tu veux appeler ta méthode et parameters le tableau content les valeurs des parametres.

Pour plus d'infos, voir la javadoc du java.sun.com
Greedo est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 16h57   #6 (permalink)
Nouveau membre du Club
 
Avatar de jerome.petit
 
Date d'inscription: novembre 2002
Localisation: SERLI - Technopole du Futuroscope
Messages: 79
Envoyer un message via MSN à jerome.petit
Par défaut Re: bouhhhhh

Citation:
Envoyé par waddle
bouhhhhhhhhh du C, oust le C !!!!!!!

pk diable vouloir faire ça en objet ??? je suis curieux...
Pour implémenter un callback, pour faire de l'IoC etc
jerome.petit est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 21h01   #7 (permalink)
Rédacteur
 
Date d'inscription: mars 2002
Messages: 634
Par défaut

Plus sérieusement, sans mettre en avant le C ou même le dénigrer, oui, celà ce pratique assez courament en Java.

Il te suffit de fournir l'instance de la classe qui implémente la méthode désirée en paramètre.
Pour pouvoir changer "à la volée" sans recompiler ou... pouvoir choisir l'instance selon tes critères, il suffit simplement que toutes les instances potentielles implémentent la même interface.

Je te conseille vivement de regarder du coté des classes Event utilisées par swing mais que j'utilise aussi à d'autre fins que Swing ( comportement métier entre autre )

Tu doit pouvoir trouver des infos du coté de la spèc JavaBean aussi. Le modèle des listener en est un exemple concret utilisé par tous depuis bien longtemps.
__________________
Clic me...
CV en ligne

Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

Pas de réponse en MP...Merci
Alwin est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2004, 21h33   #8 (permalink)
Rédacteur
 
Avatar de rozwel
 
Date d'inscription: mars 2002
Localisation: Bruxelles, Belgique
Messages: 320
Par défaut

Sans passer par des évènements ou d'autres techniques, il y a un design pattern pour ça : l'Itérateur. En tout cas ça l'illustre. Ca ressemble un peu à ce que propose Alwin. J'avais implanté ça à l'intérieur d'un Interpréteur (autre design pattern) pour pouvoir faire des traitement différents sur mon arbre syntaxique. En gros le principe est simple.

Tu définis une interface avec une seule méthode genre executer :
Code :
 
public interface Iterateur{
  public void executer(); 
}
 
Ta méthode peut prendre des paramètres et retourner quelque chose mais j'ai simplifié pour l'exemple. Au passage je viens de réaliser qu'avec la généricité de Tiger, l'implémentation d'un tel design pattern gagne en souplesse... m'enfin bon, on s'écarte du sujet.

Ensuite, tu crées des classes qui implémentent cette méthode pour pouvoir fournir un corps à ta méthode.

Code :
 
public class Compiler implements Iterateur{
  public void executer(){
    //ton code ici
  }
}
 
public class GenererDoc implements Iterateur{
  public void executer(){
    //ton code ici
  }
}
 
Et ensuite dans ton code tu peux faire appel dynamiquement au comportement qui t'intéresse. Mettons que tu définisse une méthode comme ça :
Code :
 
public void parcourir(Iterateur it){
  //va chercher le fichier à parcourir
  it.executer();
  //ferme le fichier
}
 
Et ensuite dans ta méthode principale il te suffit d'appeler :

Code :
 
parcourir(new Compiler());
parcourir(new GenererDoc());
 
Alors on est loin des quelques lignes de code que ça demande en C, mais en même temps je trouve ça plutôt élégant. Et puis de toute façon on peut difficilement faire mieux vu que pour pouvoir faire comme en C, il faudrait avoir des pointeurs et ça... hors de question ! Et c'est bien mieux comme ça !

Bon courage @+++
rozwel est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/12/2004, 13h31   #9 (permalink)
Nouveau membre du Club
 
Date d'inscription: novembre 2004
Messages: 63
Par défaut t es sur ???

t'es sur que c pas plutot le pattern Visiteur que tu voulais dire à la place de Iterateur ??? parce que là ca y ressemble drolement...

et puis les pointeurs en Java y en a partout sauf q'ils se cachent les malins..... 8) 8)
__________________
--
Powered by EPITA
Powered by IUT PARIS V
waddle est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 09/12/2004, 13h58   #10 (permalink)
Rédacteur
 
Avatar de rozwel
 
Date d'inscription: mars 2002
Localisation: Bruxelles, Belgique
Messages: 320
Par défaut

Voilà c'est exactement ça... c'est le Visiteur tu as complètement raison... il me semblait bien aussi. mea culpa !

Iterateur existe aussi mais c'est pour parcourir des collections donc rien à voir. Désolé...
rozwel est déconnecté   Envoyer un message privé Réponse avec citation
NEWS JAVAFAQs JAVATUTORIELS JAVAJAVASEARCHSOURCESLIVRESOUTILS, EDI & APIBLOGDISCUSSIONSTV

Réponse

Précédent   Forum des professionnels en informatique > Java > Général Java > Langage



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h09.


Vos questions techniques : forum d'entraide Java - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2009 www.developpez.com - Legal informations.