回调确实灵活,简单的方式实现复杂的需求
如果A类实现Base1接口,B类实现Base2接口,但是此时C类构造器只接受Base1类型。这个时候B类对象自然是不能传给C类的构造器,但是又必须得将B类穿给C类,让C类调用B类的方法。此时就可以用一个内部类解决问题。在B类中创建一个内部类。让这个内部类实现Base1接口,内部类调用B类需要用到的函数。最后把这个内部类传给C类,即可让C类调用B类需要用到的函数。
程序执行顺序大概是这样的,将B的内部类传给C的构造函数,此时base1指向B的内部类。当C执行doSomeThing()时,会执行B的内部类的doSomeThing(),这个时候会调用B的doSomeThing().
public interface Base1 {
void doSomeThing();
}
public interface Base2 {
void doSomeThing();
}
class Main{
class A implements Base1 {
@Override
public void doSomeThing() {
System.out.println("A");
}
}
class B implements Base2 {
@Override
public void doSomeThing() {
System.out.println("B");
}
public Base1 getBase1() {
return new Base1() {
@Override
public void doSomeThing() {
System.out.println("I am Base1, I from B");
B.this.doSomeThing();
}
};
}
}
class C {
Base1 base1;
C(Base1 base1) {
this.base1 = base1;
}
void doSomeThing(){
base1.doSomeThing();
}
}
public static void main(String[] args) {
Main m = new Main();
C c1 = m.new C(m.new A());
C c2 = m.new C(m.new B().getBase1());
c1.doSomeThing();
c2.doSomeThing();
}
}
/*
A
I am Base1, I from B
B
*/