Comment fait-on pour passer en parametre une fonction à une méthode ?

Comment fait-on pour passer en parametre une fonction à une méthode ? - Java - Programmation

Marsh Posté le 23-10-2003 à 20:48:58    

:hello:  
 
J'aurais voulu savoir comment fait-on pour passer en parametre une fonction à une méthode ? (comment doit etre definie la méthode et comment doit etre fait l'appel ?)
 
En C, je sais qu'il faut un pointeur sur la fonction puis ensuite on passe ce meme pointeur en parametre à la fonction cible...Mais en Java, je vois pas trop comment ça peut se faire...  :(

Reply

Marsh Posté le 23-10-2003 à 20:48:58   

Reply

Marsh Posté le 23-10-2003 à 20:58:54    

qu'est ce que tu veux faire au juste. Faut penser object hein :o


Message édité par darklord le 23-10-2003 à 20:59:35

---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 23-10-2003 à 21:01:01    

1) oublie le C :o
 
2) voilà comment on fait dans un langage objet :
 
quand tu passes une méthode M1 en paramêtre à une méthode M2(dans un lange comme le C), ce que tu fais en fait, c'est donner un moyen à la méthode M2 de faire l'action M1. Bref, ce qui t'intéresse c'est d'avoir la possibilitée, au sein de M2, d'avoir "quelque chose" qui remplira le contrat défini par la signature de la méthode M2.  
 
Bref, tu as besoin d'un objet (le quelque chose) qui possédera une méthode bien précise, c'est à dire qui implémente une interface.
 
ex :
tu as une méthode calc() qui fait une opération et qui envoie le résultat.
 

Code :
  1. // voici l'interface du sender  
  2. public interface Sender {
  3.    public void send(String message);
  4. }


 

Code :
  1. // ta classe qui fait le calcul
  2. public class Calcul {
  3.    public void calc(Sender sender) {
  4.       int resultat = 1 + 1; // faut bien faire un exemple ;)
  5.       sender.send("calcul = " + resultat);
  6.    }
  7. }


 
maintenant, tu peux envoyer n'importe quel objet qui implémenter l'interface Sender à la méthode calc. Par exemple une classe qui fait juste un log sur la sortie standard, ou dans un fichier ou qui envoie un mail, ou qui envoie le résultat par SMS, ou qui le stocke en base, etc ... tu vois le principe...
 
juste un exemple :  

Code :
  1. class OutSender implements Sender {
  2.    public void send(String message) {
  3.       System.out.println(message);
  4.    }
  5. }
  6. public class Main {
  7.    public static void main(String[] args) {
  8.       // on créé le calculateur
  9.       Calcul calculateur = new Calcul();
  10.       // on créé le sender
  11.       Sender sender = new OutSender();
  12.       // on appel la méthode
  13.       calculateur.calc(sender);
  14.    }
  15. }


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 23-10-2003 à 21:08:39    

benou a écrit :

1) oublie le C :o
 
2) voilà comment on fait dans un langage objet :
 
quand tu passes une méthode M1 en paramêtre à une méthode M2(dans un lange comme le C), ce que tu fais en fait, c'est donner un moyen à la méthode M2 de faire l'action M1. Bref, ce qui t'intéresse c'est d'avoir la possibilitée, au sein de M2, d'avoir "quelque chose" qui remplira le contrat défini par la signature de la méthode M2.  
 
Bref, tu as besoin d'un objet (le quelque chose) qui possédera une méthode bien précise, c'est à dire qui implémente une interface.
 
ex :
tu as une méthode calc() qui fait une opération et qui envoie le résultat.
 

Code :
  1. // voici l'interface du sender  
  2. public interface Sender {
  3.    public void send(String message);
  4. }


 

Code :
  1. // ta classe qui fait le calcul
  2. public class Calcul {
  3.    public void calc(Sender sender) {
  4.       int resultat = 1 + 1; // faut bien faire un exemple ;)
  5.       sender.send("calcul = " + resultat);
  6.    }
  7. }


 
maintenant, tu peux envoyer n'importe quel objet qui implémenter l'interface Sender à la méthode calc. Par exemple une classe qui fait juste un log sur la sortie standard, ou dans un fichier ou qui envoie un mail, ou qui envoie le résultat par SMS, ou qui le stocke en base, etc ... tu vois le principe...
 
juste un exemple :  

Code :
  1. class OutSender implements Sender {
  2.    public void send(String message) {
  3.       System.out.println(message);
  4.    }
  5. }
  6. public class Main {
  7.    public static void main(String[] args) {
  8.       // on créé le calculateur
  9.       Calcul calculateur = new Calcul();
  10.       // on créé le sender
  11.       Sender sender = new OutSender();
  12.       // on appel la méthode
  13.       calculateur.calc(sender);
  14.    }
  15. }




 
Je vois un peu pres le principe mais je pense qu'il y a plus simple non ? Comme j'ai pas encore vu les Interfaces à l'ecole, je prefere y aller doucement...N'y a t-il pas moyen de faire la meme chose sans interface ?
 :jap:

Reply

Marsh Posté le 23-10-2003 à 21:13:28    

c pas une question d'y aller doucement ou pas, c'est une question de faire les choses convenablement. Si tu veux faire des trucs de genre, retourne faire du C et puis c'est tout :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 23-10-2003 à 21:24:09    

neo9205 a écrit :


 
Je vois un peu pres le principe mais je pense qu'il y a plus simple non ? Comme j'ai pas encore vu les Interfaces à l'ecole, je prefere y aller doucement...N'y a t-il pas moyen de faire la meme chose sans interface ?
 :jap:  

oui, tu prends uniquement la classe Calcul de benou et si tu veux changer le code, tu fais une sous-classe de Calcul avec ton propre code.
 
Par contre, tu n'as le droit d'utiliser cette méthode que jusqu'à ce que tu progresses en objet. Si tu reviens dans 1-2 mois avec ça, on te flingue.

Reply

Marsh Posté le 23-10-2003 à 21:47:11    

neo9205 a écrit :


Je vois un peu pres le principe mais je pense qu'il y a plus simple non ? Comme j'ai pas encore vu les Interfaces à l'ecole, je prefere y aller doucement...N'y a t-il pas moyen de faire la meme chose sans interface ?
 :jap:  


ca sert à quoi de faire mal quand on sait faire bien ??  :sweat:  
 
si tu veux vraiment pas faire d'interface, tu modifie la méthode calc pour qu'elle prenne juste un paramêtre du type de l'objet qui possèdera la méthode que tu veux appeler dans la méthode calc, mais tu perds toute l'évolutivité du truc. c'est nul[:spamafote]
 
enfin gref, le principe c'est de passer un objet en paramêtre (à la place du pointeur de fonction du C)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 23-10-2003 à 21:55:48    

les interfaces, c bon [:huit]
 
 
edit: merci benou


Message édité par veryfree le 23-10-2003 à 22:04:21
Reply

Marsh Posté le 23-10-2003 à 21:57:42    

veryfree a écrit :

les interfaces, c bon [:smileyQuiTireLaLangue]


[:huit] [:benou_miam] http://perso.wanadoo.fr/vieuxbenou/benous/harry_miam.gif http://perso.wanadoo.fr/vieuxbenou/benous/super_benou_miam.gif


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 16:28:06    

1/ personne à relever le fait qu'il mélangeait fonction et méthode?  (alors qu'on ne parle que de methode en java)
 
2/ si il faut on peut faire de la reflection :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:28:06   

Reply

Marsh Posté le 24-10-2003 à 16:28:29    

[:atigrou]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:33:48    

the real moins moins a écrit :

1/ personne à relever le fait qu'il mélangeait fonction et méthode?  (alors qu'on ne parle que de methode en java)


fontion, méthode, on a tous compris de quoi il parlait ...
 
d'ailleur, en java, le terme le plus approprié serait fonction :o
 

the real moins moins a écrit :

2/ si il faut on peut faire de la reflection :o


il connais pas encore les iterfaces et elles lui  font peur alors va pas lui parler de reflection :o


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 16:35:51    

1a/ certes ben quite à lui apprendre quelque chose...
1b/ ha bon :heink: HA BON :heink:
2/ certes. mais si c'est pour donner des cours, je vais me faire prof au lieu de passer mon temps ici moi...


Message édité par the real moins moins le 24-10-2003 à 16:36:13

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:38:02    

Benou > tout ça n'a rien à voir avec le C. c'est le concept même d'objet fonction. le C propose de passer des pointeurs de fonctions, mais pas d'objet, le C++ propose un operator() poura voir la synthaxe d'un appel de fonction, pour Python, une fonction est déjà un objet et il y a aussi __call__, en Lisp/Scheme, c'est direct. Dans cette histoire, le seul à faire des acrobaties avec un langage objet pour arriver à exprimer ça, c'est toi. Faut dire ce qu'il est : si on aime le concept d'objet fonction (j'en fait tout le temps), et bien Java est mal aisé pour l'utiliser.
Alors pas la peine de vanner un mec sur ses connaissances en C, ce que tu lui fais en 5 lignes de Java, il te le fait en 1 lignes de C

Reply

Marsh Posté le 24-10-2003 à 16:38:54    

Taz a écrit :

Alors pas la peine de vanner un mec sur ses connaissances en C, ce que tu lui fais en 5 lignes de Java, il te le fait en 1 lignes de C


 
troll :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-10-2003 à 16:39:25    

oh putain, not again :sweat:
 
(c'est pas la taille qui compte, mais la façon dont on s'en sert :o)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:40:22    

typiquement le truc qu'on dit quand on en a une petite :o

Reply

Marsh Posté le 24-10-2003 à 16:42:55    

tu peux pas t'empecher hein ?  :pfff:  
 
où est ce que j'ai vané le mec ??  
Il pose une question, je lui donne la réponse ... bien complete en plus la réponse... Y a que toi pour trouver un truc à redire ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 16:43:30    

Taz a écrit :


Alors pas la peine de vanner un mec sur ses connaissances en C, ce que tu lui fais en 5 lignes de Java, il te le fait en 1 lignes de C


 
T'as 15 ans de retard là. Economiser des lignes de code quand on programme, c'est fini!

Reply

Marsh Posté le 24-10-2003 à 16:43:50    

Taz a écrit :

typiquement le truc qu'on dit quand on en a une petite :o

tu veux voir? [:naughty]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:44:32    

El_gringo a écrit :


 
T'as 15 ans de retard là. Economiser des lignes de code quand on programme, c'est fini!

dans mes ST magazine y'avait des concours pour faire des softs en 10 lignes maxi... y'avait des mecs qui faisait des jeux complets comme ça en gfa basic :love:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:46:05    

El_gringo a écrit :


 
T'as 15 ans de retard là. Economiser des lignes de code quand on programme, c'est fini!

un langage qui te permet d'exprimer naturellement un concept avancé, je ne vois pas où est le problème. ce que tu dis, c'est comme si tu parlais d'assembleur ...

Reply

Marsh Posté le 24-10-2003 à 16:47:00    

Taz a écrit :

un langage qui te permet d'exprimer naturellement un concept avancé, je ne vois pas où est le problème. ce que tu dis, c'est comme si tu parlais d'assembleur ...


 
Harko c pour ton dommaine là :D


---------------
Le Tyran
Reply

Marsh Posté le 24-10-2003 à 16:47:23    

et c'est parti pour un squatage hors sujet trollesque à souhait ...
 
[:neowen]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 16:48:23    

t'as qu'a pas faire ce genre de réflexions

Reply

Marsh Posté le 24-10-2003 à 16:48:26    

benou a écrit :

et c'est parti pour un squatage hors sujet trollesque à souhait ...
 
[:neowen]


 
C vendredi :o


---------------
Le Tyran
Reply

Marsh Posté le 24-10-2003 à 16:49:02    

Taz a écrit :

t'as qu'a pas faire ce genre de réflexions


laquelle ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 16:51:55    

Taz a écrit :

t'as qu'a pas faire ce genre de réflexions


 
Et ça à été Modo. Mon Dieu... :sarcastic:

Reply

Marsh Posté le 24-10-2003 à 16:52:14    

vos gueules :o


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 24-10-2003 à 16:53:06    

El_gringo a écrit :


Et ça à été Modo. Mon Dieu... :sarcastic:  


nan mais attend, j'aimerai bien comprendre à propos de quoi il e na après moi sur ce coup là ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 16:54:14    

El_gringo a écrit :


 
Et ça à été Modo. Mon Dieu... :sarcastic:  

en meme temps vu une des moitiés de modo qui reste... :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 16:54:25    

ben j'ai déjà justifié ...
bon je sors de toutes façons

Reply

Marsh Posté le 24-10-2003 à 16:56:26    

Taz a écrit :

ben j'ai déjà justifié ...
bon je sors de toutes façons


ouais, et éventuellement évite de revenir ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 24-10-2003 à 17:16:56    

Taz a écrit :

Faut dire ce qu'il est : si on aime le concept d'objet fonction (j'en fait tout le temps), et bien Java est mal aisé pour l'utiliser.

La différence c'est que java n'est prévu _que_ pour faire de l'objet, pas pour mélanger du fonctionnel avec.  
 
Il est d'ailleur assez mal venu de mélanger références sur des fonction, fermetures lexicales réelles, et opérateurs déguisés. Surtout que dans le tas c'est sûrement pas la solution qui est offerte par C/C++ qui s'en sort le mieux. De plus, quand on comence à foutre ça dans un langage qui possède (massivement) des effets de bord, c'est pas la peine de se retrouver à poil.
 
Mais bon c'est sur que quand on est un ha><or qui compte ses lignes de code, essayer d'y voir un peu plus loin que la grammaire, c'est un truc de faible.

Reply

Marsh Posté le 24-10-2003 à 17:20:24    

putain, mais c'est quoi cette histoire de nombres de lignes ? vous êtes butés ou quoi ? vous êtes les premier à critiquer le C par ce que la gestion de char* est longue et fastidieuse comparé à des objets de types string, et vous êtes tous d'accord qu'un langage qui permet de manipuler de manière concise et élégante les chaines de caractères est bien meilleur sur ce point :o

Reply

Marsh Posté le 24-10-2003 à 17:28:09    

Taz a écrit :

putain, mais c'est quoi cette histoire de nombres de lignes ? vous êtes butés ou quoi ? vous êtes les premier à critiquer le C par ce que la gestion de char* est longue et fastidieuse comparé à des objets de types string, et vous êtes tous d'accord qu'un langage qui permet de manipuler de manière concise et élégante les chaines de caractères est bien meilleur sur ce point :o

Y'a que ta remarque était très très conne. Et qu'il faudrait pas que les débutants répètent ce genre de conneries.
 
Mélanger pointeur sur fonction, la surcharge du mauvais opérateur, et fermeture lexicale et justifier le tout par le nombre de lignes de code ou "l'intuitivié" (c'est vrai qu'envoyer un message à un objet c'est vraiment un truc contrintuitif en objet) c'est bien la preuve de n'avoir rien capté à l'histoire.
 
En particulier, reprocher à un langage de ne pas avoir avoir une fonctionnalité qui n'appartient pas à sa catégorie alors qu'il l'a (et à quel prix !) et donner en exemple 2 trucs qui _semblent_ l'avoir pour le débutant mais qui ne l'ont pas, je trouve ça très fort. T'aurais mieux fait de citer les crochets de smalltalk plustôt que de citer le langage de tes nuits humides sur ce coup là.


Message édité par nraynaud le 24-10-2003 à 17:29:41
Reply

Marsh Posté le 24-10-2003 à 17:46:16    

c'est quoi une "fermeture lexicale"?
(merci d'utiliser des termes simples pour l'explication et au besoin un exemple con et concret:D)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 17:46:33    

nraynaud a écrit :

le langage de tes nuits humides  

[:rofl]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 24-10-2003 à 18:35:54    

the real moins moins a écrit :

c'est quoi une "fermeture lexicale"?
(merci d'utiliser des termes simples pour l'explication et au besoin un exemple con et concret:D)

c'est un objet qui embarque avec lui toutes les variables visible à l'endroit où il est déclaré et chaque variable, embarque elle-même les variables qui sont visibles de son point de vue. Comme en général la visibilité est lexicale, on appelle ça une fermeture lexicale.
 
Pour y voir le rapport avec la choucroute, prenons un petit exemple une belle méthode non statique en C++, si on prend un ,pointeur dessus, ce qui est parfaitement légal, on va avoir du mal à l'exécuter, because il lui manque tout, jusqu'au this, elle n'embarque rien. Elle est complètement inutile. C'est pourquoi en C++ on évite de prendre des pointeurs sur autre chose que des trucs statiques, les variables globales qu'elle petu référence, sont, elles, accessible de partout (notez, pas "visibles", mais "accessible", le mot-clef "static" fait la différence).
 
En java, on a ces fameuses "inner-class" qui sont beaucoup plus qu'elles n'y paraissent, leurs instances n'existent que dans le cadre d'une instance de la classe englobante. En réalité, la classe interne embarque une référence sur l'instance englobante, embarquant du coup, ses variables d'instance et celle de sa classe englobante. C'est logique, les variables de l'instance englobante sont accessibles dans les méthodes de l'instance interne. Les variables statiques, sont, comme en C++ accessibles de n'importe où.  
 
Plus loin : une méthode peut être définie dans une autre méthode auquel cas elle a accès à tout ce qui est visible au point de définition. Et ça se complique, car l'existance des variables locales de la méthode englobante au moment de l'accès depuis l'instance interne n'a rien de garantie. C'est pourquoi elle vont être embarquées (par copie) et qu'elles doivent être "final" (pour être sûr qu'il s'agit bien du même objet dans la méthode englobante et englobée, c'est une garantie que n'offrent pas naturellement les effets de bord sinon).
 
 
Les langages fonctionnels embarquent simplement le contexte en copiant toutes les variables visibles dans un tableau (ils sont téhoriquement sans opérateur d'affectation).

Reply

Marsh Posté le 24-10-2003 à 18:42:55    

bon je crois que je vais devoir relire tout ça [:gratgrat]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed