扩展抽象类和实现接口的组合

4

可能重复:
为什么ArrayList有“implements List”?

我已经阅读了几篇文章I vs AC的区别以及关于何时使用接口和抽象类的SO问题。

当我遇到ArrayList Class时,ArrayList class继承AbstractList Class并实现List interface。 AbstractList和List具有共同的方法,如add(),remove()等。

编辑:换句话说,如果AbstractList实现List,为什么要让Arraylist类实现List?

在两者具有共同方法时,何时首选此种组合继承行为设计?

public class ArrayList<E> extends AbstractList<E>
        implements List<E>

1
"AbstractList和List有共同的方法,如add(),remove()等。" => AbstractList实现了List:public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> - assylias
AbstractList 也实现了 List 接口。 - PermGenError
2
换句话说,在ArrayList声明中使用“implements List”是多余的。 - assylias
3个回答

4

有时我会创建一个抽象的BaseClass,它实现了一个接口IBaseClass,然后创建一个ChildClass,它继承了BaseClass。我的意思是:

public interface IBaseClass {

}

public abstract class BaseClass implements IBaseClass {

}

public class ChildClass extends BaseClass {

}

现在假设我有一个接口IChildClass,并且ChildClass实现了它。
public class ChildClass extends BaseClass implements IChildClass {

}

假设 IBaseClass 有一个方法 someMethod。如果你想通过实现接口 IChildClass 来使用 ChildClass 的实例,可以这样:

IChildClass obj = new ChildClass();

那么您就不能调用 obj.someMethod()。您需要这样做:

public interface IChildClass extends IBaseClass {

}

您可以在Java 1.2 documentation中找到,接口java.util.List在早期版本中并未继承java.util.Collection,但在最新版本中已经实现了继承。在那个时候,java.util.List是至高无上的接口,java.util.AbstractList实现了该List,还有ArrayList。而AbstractList则继承了AbstractCollection。当时,AbstractCollection是至高无上的类。目前,AbstractCollection实现了Collection。因此,显然这种设计模式是为了考虑Java不断扩展的模式。


3
在这种情况下,implements List是多余的。可以通过不必要地浏览类层次结构来清楚地表明此调用实现了List。

仅为了可读性而已? - Srujan Kumar Gulla

1

AbstractList<E> 也实现了 List<E>,因此它们具有相同的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接