- 接口和继承
public interface In {
void doSomething();
}
父类:
public class T{
private In in;
public void setIn(In in){
this.in = in;
}
// 需要子类重写的普通方法
protected void layoutChildren() {
}
public void Hello(){
// 用子类对象,会调用子类实现方法
layoutChildren();
// 调用接口方法
in.doSomething();
}
}
子类:
public class CT extends T implements In {
@Override
protected void layoutChildren() {
System.out.println("HAHAHA");
}
@Override
public void doSomething() {
System.out.println("Do Something.");
}
@Test
public void getT(){
setIn(this);
Hello();
}
}
结果:
- 即常规做法,讲子类对象直接传进去,但没人这么写代码;
- 将父类需要调用的方法,在子类中写为
public static
,但更加离谱,因为父类不关心子类,不应该知道子类的类名,更不应该知道子类的方法。 - 既然可以父类通过类名来调用静态,那么也就可以使用反射的方式。但还是很离谱,原因同上。
所以一般而言使用为上面的两种方式,注意到在父类中的layoutChildren
方法我们没有实现,可以申明为抽象方法,即:
public abstract class T{
private In in;
public void setIn(In in){
this.in = in;
}
// 需要子类重写
protected abstract void layoutChildren();
public void Hello(){
layoutChildren();
in.doSomething();
}
}
那么,我们父类在调用layoutChildren
方法的时候,就是调用子类的实现,但具体是哪个子类的实现,其实父类并不关心。接口也是如此的思想。也就是:
- 行为由父类/接口控制,子类实现。
当然上面代码的接口方式我感觉写的不好,感觉可以尝试使用Spring
的DI
方式。