情景:
假设现在有一个人,既是程序员,又是老师。
现有一个Teachable接口和Programmer基类,它们都提供了一个work方法,签名完全相同,但功能不一样。
public interface Teachable {
void work();
}
public class Programmer {
private String name;
public Programmer(){}
public Programmer(String name)
{
this.name=name;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void work()
{
System.out.println(name+"在灯下认真敲键盘...");
}
}
如果public class TeachableProgrammer extends Programmer implements Teachable,只有一个work方法,实现不了既编程又教学。
这时可以用一个仿闭包的内部类来实现这个功能:
public class TeachableProgrammer extends Programmer {
public TeachableProgrammer(){}
public TeachableProgrammer(String name)
{
super(name);
}
private void teach()
{
System.out.println(getName()+"老师在讲台上讲解...");
}
private class Closure implements Teachable
{
//非静态内部类回掉外部类实现work方法
public void work()
{
teach();
}
}
//返回一个非静态内部类引用,外部类通过该引用实现内部类方法
public Teachable getCallbackReference()
{
return new Closure();
}
}
下面程序示范TeachableProgrammer既执行教学的work方法,又执行编程的work方法。
public class TeachableProgrammerTest {
public static void main(String[] args) {
TeachableProgrammer tp=new TeachableProgrammer("李明");
tp.work();//直接调用从Programmer继承到的work方法
tp.getCallbackReference().work();//表明执行Closure的work方法,实际执行的是TeachableProgrammer的teach方法
}
}