什么是接口回调?

1 .接口回调是什么 [2]
接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。看下面示例。
interface People{
   void peopleList();
}
class Student implements People{
   public void peopleList(){
     System.out.println("I’m a student.");
   }
}
class Teacher implements People{
  public void peopleList(){
    System.out.println("I’m a teacher.");
  }
}
public class Example{
  public static void main(String args[]){
    People a;             //声明接口变量
    a=new Student();      //实例化,接口变量中存放对象的引用
    a.peopleList();        //接口回调
    a=new Teacher();     //实例化,接口变量中存放对象的引用
    a.peopleList();       //接口回调
  }
}
结果:
I’m a student.
I’m a teacher.
再来看看向上转型(upcasting)的概念。
2 .什么是向上转型 [1]
Shape s=new Circle();
这里,创建了一个Circle对象,并把得到的引用立即赋值给Shape。通过继承,Circle就是一种Shape。
假设你调用基类方法(它已在导出类中被覆盖):
s.draw();
由于后期绑定(多态),将会正确调用Circle.draw()方法。
 
3 .向上转型与接口回调的区别
看似向上转型和接口回调是一回事。看下面两句话,均出自Thinking in Java。
使用接口的核心原因:为了能够向上转型为多个基类型[1]。即利用接口的多实现,可向上转型为多个接口基类型(具体见《抽象与接口》章节6)。
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。(此句摘自Thinking in Java 3rd 接口与内部类一章)
所以,我认为,这两个概念是从两个方面来解释一个行为。接口回调的概念,强调使用接口来实现回调对象方法使用权的功能(下一章节详细分析)。而向上转型则牵涉到多态和运行期绑定的范畴。
4 .用 Java 接口实现回调函数的等价功能
熟悉 MS-Windows 和 X Window System 事件驱动编程模型的开发人员,习惯于传递在某种事件发生时调用(即“回调”)的函数指针。Java 的面向对象模型目前并不支持方法指针,Java 的接口支持提供了一种获得回调的等价功能的机制。其技巧就是:定义一个简单接口,并在该接口中声明我们要调用的方法。
假定我们希望在某个事件发生时得到通知。我们可以定义一个接口:
InterestingEvent.java
package org.zj.sample;
public interface InterestingEvent {
    public void interestingEvent ();
}
 
这使得我们可以控制实现该接口的类的任何对象。因此,我们不必关心任何外部类型信息。
发出事件信号的类必须等待实现了 InterestingEvent 接口的对象,并在适当时候调用 interestingEvent() 方法。
EventNotifier.java
package org.zj.sample;
public class EventNotifier {
    private InterestingEvent ie;
    private boolean somethingHappened;
 
    public EventNotifier(InterestingEvent event) {
         ie = event; // 保存事件对象以备后用。
         somethingHappened = false; // 还没有要报告的事件。
    }
 
    public void doWork() {
         if (somethingHappened) { // 检查设置的谓词。
           ie.interestingEvent();// 通过调用接口的这个方法发出事件信号。
         }
    }
    
    public void setHappened(){//设置谓词。
         somethingHappened=true;
    }
}
 
在上例中,使用 somethingHappened 谓词来跟踪是否应触发事件。希望接收事件通知的代码必须实现 InterestingEvent 接口,并将自身引用传递给事件通知程序。
CallMe.java
package org.zj.sample;
public class CallMe implements InterestingEvent {
    @SuppressWarnings("unused")
    private EventNotifier en;
 
    public CallMe() {
         // 注意 EventNotifier (InterestingEvent event),应该传递一个接口类型。
         // 而下面将this,即实现了InterestingEvent接口的CallMe实例传递给
//EventNotifier。也就是所谓的接口回调了。
         en = new EventNotifier(this); // 创建事件通知程序,并将自身引用传递给它。
    }
 
    // 为事件定义实际的处理程序。
    public void interestingEvent() {
              System.out.println("Call me Hello.");
    }
}
 
下面写个测试类。
Test.java
package org.zj.sample;
public class Test {
    public static void main(String[] args) {
         EventNotifier en=new EventNotifier(new CallMe());
         en.setHappened();
         en.doWork();
    }
}
 
结果:
Call me Hello.
5 .参考资料
[1]Thinking in Java 3rd
[2]耿祥义,Java实用教程,清华大学出版社
[3] John D. Mitchell,Java 接口实现回调函数的等价功能,IBMDeveloper网站
  • 15
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
接口回调是一种常见的编程模式,用于实现程序之间的通信和交互。在Python中,可以通过函数或者类方法来实现接口回调。 如果使用函数来实现接口回调,可以将一个函数作为参数传递给另一个函数或者类的方法,然后在适当的时候调用这个函数来进行回调操作。 示例代码如下: ```python def callback_function(arg1, arg2): # 执行回调操作 print("Callback function called with arguments:", arg1, arg2) def perform_operation(callback): # 进行一些操作 result = 42 # 调用回调函数 callback("arg1", "arg2") # 使用回调函数 perform_operation(callback_function) ``` 上述代码中,`perform_operation` 函数接收一个回调函数作为参数,并在适当的时候调用这个回调函数。在这个例子中,我们调用 `perform_operation` 函数时会执行回调函数 `callback_function`,并传递两个参数 `"arg1"` 和 `"arg2"`。 如果使用类方法来实现接口回调,可以定义一个接口类,其中包含一个或多个方法,然后创建一个实现该接口的类,并将其实例传递给另一个类的方法进行回调操作。 示例代码如下: ```python class CallbackInterface: def callback_method(self, arg1, arg2): # 执行回调操作 print("Callback method called with arguments:", arg1, arg2) class PerformOperation: def __init__(self, callback): self.callback = callback def perform_operation(self): # 进行一些操作 result = 42 # 调用回调方法 self.callback.callback_method("arg1", "arg2") # 使用回调方法 callback_instance = CallbackInterface() perform_operation = PerformOperation(callback_instance) perform_operation.perform_operation() ``` 上述代码中,`CallbackInterface` 类定义了一个回调方法 `callback_method`。`PerformOperation` 类接收一个实现了 `CallbackInterface` 接口的对象作为参数,并在适当的时候调用该对象的回调方法。 无论是使用函数还是类方法来实现接口回调,关键在于正确地传递回调函数或者实现了回调接口的对象,并在适当的时候进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值