![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Langage Langage Java, syntaxe, POO, conventions . Avant de poster -> FAQ Java |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Invité de passage
![]() Date d'inscription: décembre 2004
Messages: 4
|
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 ] |
|
|
|
|
|
#2 (permalink) |
![]() Date d'inscription: février 2004
Localisation: La tête en l'air, les pieds sur terre (à Toulouse).
Messages: 1 828
|
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 :
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()); .... } Ai-je été clair ? |
|
|
|
|
|
#3 (permalink) |
|
Membre du Club
![]() Date d'inscription: décembre 2004
Messages: 81
|
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() ; } Code :
public void uneFonction(Executable maFonctionParametre) { ... } |
|
|
|
|
|
#5 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: avril 2003
Messages: 63
|
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"); - récupérer la méthode qui t'intéresse en faisant Code :
Method maMethode = maClasse.getMethod("nomMethode", parameters); - et enfin tu pourras l'évoquer en faisant Code :
maMethode.invoke(instance, parameters); Pour plus d'infos, voir la javadoc du java.sun.com |
|
|
|
|
|
#7 (permalink) |
![]() Date d'inscription: mars 2002
Messages: 627
|
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, celles qui connaissent le binaire, et les autres... Pas de réponse en MP...Merci |
|
|
|
|
|
#8 (permalink) |
![]() Date d'inscription: mars 2002
Localisation: Bruxelles, Belgique
Messages: 313
|
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(); } 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 } } Code :
public void parcourir(Iterateur it){ //va chercher le fichier à parcourir it.executer(); //ferme le fichier } Code :
parcourir(new Compiler()); parcourir(new GenererDoc()); Bon courage @+++ |
|
|
|
|
|
#9 (permalink) |
|
Nouveau membre du Club
![]() Date d'inscription: novembre 2004
Messages: 63
|
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
__________________
-- Powered by EPITA Powered by IUT PARIS V |
|
|
|
|
|
#10 (permalink) |
![]() Date d'inscription: mars 2002
Localisation: Bruxelles, Belgique
Messages: 313
|
Voilà c'est exactement ça... c'est le Visiteur tu as complètement raison... il me semblait bien aussi.
Iterateur existe aussi mais c'est pour parcourir des collections donc rien à voir. Désolé... |
|
|
|
|
![]() |
![]() |
||
[Conception] Passer une fonction en paramètre
|
||
| Outils de la discussion | |
|
|