我曾经在Java中开发过,直到我开始用C#及其代表编程时,我才完全理解回调概念。
原因是因为@DenilsonSá完美地提到Java不使用指针函数。 换句话说,在Java中,您可以调用一个方法并传递一些参数,如原始值(int,long,char,boolean等)和对象(字符串或任何类的任何实例,就像传递对象时一样基本上将这个地址传递给存储在内存某处的真实对象的内存)。
Java中的回调概念可以通过使用接口并将它们(实现它们的对象)作为参数传递来实现。想象一下,你有以下接口定义了2个方法,任何想要作为ResultListener行为的类都必须实现。
interface ResultListener {
void onSuccessOperation(String description);
void onFailedOperation(String description);
}
现在想象你有一个是showScreen方法
class MyMainScreen implements ResultListener {
public void showScreen() {
//do some things..
SmartClass smartClass = new SmartClass();
smartClass.divideAndNotify(5, 0, this);
}
public void onSuccessOperation(String description) {
System.out.println("SUCCESS!!. " + description);
}
public void onFailedOperation(String description) {
System.out.println("FAILED. " + description);
}
}
内运行,且该知道如何划分功能,SmartClass主程序。
class SmartClass {
public void divideAndNotify(int numerador, int denominador, ResultListener resultListener) {
if (denominador == 0) {
resultListener.onFailedOperation("Nobody can divide by zero!!");
} else {
int total = numerador/denominador;
resultListener.onSuccessOperation("The result is " + total);
}
}
}
这里的有趣的部分是MyMainScreen被表现为一个ResultListener所以它需要实现该接口的ResultListener定义的方法。 MyMainScreen知道如何在控制台上打印消息,但它不知道计算的任何内容,这就是为什么它实例化SmartClass以使用它的方法divideAndNotify,该方法接受2个数字并引用将要侦听结果的实例(在我们的情况下,这种情况下是MyMainScreen实例本身,这就是为什么它通过自身字这)
件SmartClass方法divideAndNotify知道数学,并会通知谁与操作的结果听。它的方法知道resultListener将包含对结果成功或失败时知道该做什么的对象的引用。
这里的回调概念是SmartClass正在委托关于如何处理结果的功能,就像在回收作为参数的实例中“回调”某些东西。
作为一个总结:A 回调只是一个任务的代表团。 PS:使用C#这个概念更直接,因为C#具有委托类型,这些委托类型是存储函数所在的内存地址的变量(存储的函数必须与委托中定义的签名相匹配)。
有趣的阅读,但我也试图了解发布的代码。 – zengr 2010-10-28 09:41:24