这里要讨论的是,接口、抽象类、普通类 三者的一个组合:
首先是,接口定义了功能性的方法;
然后,一个抽象类实现了这个接口,作为骨架实现类,它完成了接口的一部分实现(默认实现)
最后是一个普通类,继承自这个抽象的股价实现类,并完成了抽象类中未实现的方法。
接口:
public interface 交通运输able {
void 装货();
void 卸货();
void 运输();
}
抽象类:
public class 卡车 implements 交通运输able {
public void 运输() {
.....
}
}
子类:
public class 某型号卡车 extends 卡车 {
public void 装货(){
.....
}
public void 卸货(){
.....
}
}
以上是我给出的代码。
现在要考虑(或者说犹豫、疑惑)的地方是在 子类 的定义中,是否还要明示 实现 接口 ?
public class 某型号卡车 extends 卡车 implements 交通运输able {
开始我的想法是,不需要 的。因为:
1)作为父类的那个抽象类已经实现了接口,子类自然就已经实现了。
2)如果我只将这个抽象类类对外开放(允许他人扩展自己的各种卡车去)的话,可以把 接口 作为“包级私有”类封装起来。这样可以很方便日后为接口增加新的方法,只要确保新增的方法,在抽象类中都提供默认实现就可以了。
而如果向上一行这样使子类也明示实现接口的话,就需要将接口公有化。那么日后就没法增加新方法了。(因为你不知道已经有多少人实现了这个接口,你一增加新方法,他们必须相应地增加实现)
似乎在“子类中也明示实现接口”是对自己的禁锢。但是,我之所以要发这个帖子请大家讨论的原因是,我看了 List、AbstractList、ArrayList 这三个源码。
恰恰在 AbstractList 已经实现了 List 接口的情况下,其子类 ArrayList 仍然明示的实现了 List 接口。我不知道这是一种严谨的做事风格呢?还是作者出于对自己的充分自信呢(List接口日后肯定不会扩充新方法了!)?
欢迎大家讨论。