Cet article présente principalement des exemples d'implémentation de fonctions de rappel par Java via des classes anonymes. La fonction de rappel est une spécification d'une signature de fonction (plusieurs paramètres d'entrée, un paramètre de sortie). Bien qu'il n'y ait pas de déclaration de fonction en Java, Java peut utiliser des interfaces. pour faire respecter les spécifications. Vous pouvez consulter l'explication détaillée ci-dessous pour les étapes de fonctionnement spécifiques, et les amis intéressés peuvent s'y référer.
En langage C, les noms de fonctions peuvent être transmis sous forme de pointeurs de fonction vers des paramètres formels pour implémenter des rappels
void f1() { printf("f1()\n"); } void f2() { printf("f2()\n"); } void f3() { printf("f3()\n"); } void do_func(void(*f)()) { f(); } int main() { do_func(f1); do_func(f2); do_func(f3); }
En C++11, implémentation des rappels peut également être implémenté via des modèles de fonction et des expressions lambda
template <typename Func> void do_func(Func f) { f(); } int main() { do_func([]() { printf("f1()"); }); do_func([]() { printf("f2()"); }); do_func([]() { printf("f3()"); }); }
Si l'implémentation du code de la fonction de rappel est plus complexe et a une valeur de réutilisation, des expressions lambda telles que The. La solution unique ne convient pas. Avant C++11, elle était implémentée via des objets fonction. Pour parler franchement, un objet fonction est un objet ordinaire d'une classe, mais C++ peut surcharger l'opérateur crochet, de sorte qu'appeler la méthode Operator() d'un objet de la classe est aussi naturel que d'appeler une fonction.
En analysant l'essence, en fait, la fonction de rappel est une spécification d'une signature de fonction (plusieurs paramètres d'entrée, un paramètre de sortie). Bien qu'il n'y ait pas de déclaration de fonction en Java, Java peut utiliser des interfaces pour appliquer des spécifications.
interface Funcable { void Func(); }
De cette façon, tant que la classe qui implémente l'interface a une fonction membre avec la même signature de fonction que void Func() (enfin, je suis toujours pas habitué aux méthodes) ), il vous suffit donc de passer l'objet de la classe qui implémente l'interface dans la fonction, puis d'appeler la méthode Func() de l'objet dans la fonction
class F1 implements Funcable { @Override public void Func() { System.out.println("f1()"); } } public class Test { public static void do_func(Funcable funcable) { funcable.Func(); } public static void main(String[] args) { do_func(new F1()); } }
Pour économiser la quantité de code ici, les classes F2 et F3 ne seront pas écrites. Et l'utilisation des classes anonymes de Java peut enregistrer du code, similaire aux expressions lambda
do_func(new Funcable() { @Override public void Func() { System.out.println("f2()"); } });
En parlant d'expressions lambda, il peut capturer des variables externes de cette façon. capturer explicitement les variables externes via des constructeurs anonymes
String msg = "f3()"; do_func(new Funcable() { String _msg; { _msg = msg; } @Override public void Func() { System.out.println(_msg); } });
Cette approche est très similaire aux expressions lambda, car les classes anonymes Le constructeur anonyme ne peut prendre que des variables externes comme paramètres de construction, ce qui équivaut à la "capture" de l'expression lambda. La méthode d'écriture correspondante de l'expression lambda en C++ est
std::string msg = "f3()"; do_func([&msg]() { std::cout << msg << std::endl; });
Java8 a également des expressions lambda, elle peut donc être écrite. comme ça
do_func(() -> { System.out.println(msg); });
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!