この記事では、Java が匿名クラスを介してコールバック関数を実装する例を主に紹介します。コールバック関数は、関数シグネチャ (複数の入力パラメータ、1 つの出力パラメータ) の仕様です。規制を施行する。具体的な操作手順については、以下の詳細な説明を確認して、興味のある友人は参照してください。
C言語では、関数名を関数ポインタとして仮パラメータに渡してコールバックを実装できます
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); }
C++11では、コールバックは関数テンプレートとラムダ式を通じて実装することもできます
template <typename Func> void do_func(Func f) { f(); } int main() { do_func([]() { printf("f1()"); }); do_func([]() { printf("f2()"); }); do_func([]() { printf("f3()"); }); }
Ifコールバック関数のコード実装は比較的複雑で、再利用の価値があるため、ラムダ式などの 1 回限りのソリューションは適切ではありません。C++11 より前では、関数オブジェクトを通じて実装されていました。率直に言うと、関数オブジェクトはクラスの通常のオブジェクトですが、C++ では括弧演算子をオーバーロードできるため、クラスのオブジェクトの Operator() メソッドの呼び出しは関数を呼び出すのと同じくらい自然です。
本質を分析すると、実際、コールバック関数は関数シグネチャ (複数の入力パラメーター、1 つの出力パラメーター) の仕様です。Java には関数宣言がありませんが、インターフェイスを使用して仕様を強制できます。
interface Funcable { void Func(); }
このように、インターフェイスを実装するクラスが void Func() と同じ関数シグネチャを持つメンバー関数を持っている限り (まあ、まだ name メソッドに慣れていないので)、それを実装する必要があります このインターフェースを持つクラスのオブジェクトを関数に渡し、関数内でオブジェクトの Func() メソッドを呼び出します
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()); } }
ここでコード量を節約するために、クラス F2 と F3 は次のようにします。書かれないこと。また、Java の匿名クラスを使用すると、ラムダ式と同様にコードを保存できます
do_func(new Funcable() { @Override public void Func() { System.out.println("f2()"); } });
ラムダ式と言えば、Java では、この方法は匿名コンストラクターを介して実行することもできます。外部変数を明示的にキャプチャします
String msg = "f3()"; do_func(new Funcable() { String _msg; { _msg = msg; } @Override public void Func() { System.out.println(_msg); } });
このアプローチはラムダ式に非常によく似ています。匿名クラスの匿名コンストラクターは構築パラメータとして外部変数のみを使用できるため、ラムダ式の「キャプチャ」に相当します。C++ でのラムダ式の対応する記述方法は次のとおりです。
std::string msg = "f3()"; do_func([&msg]() { std::cout << msg << std::endl; });
java8にもラムダ式があるので、このように書くこともできます
do_func(() -> { System.out.println(msg); });
以上が匿名クラスを使用して Java でコールバック関数を実装する例の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。