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

时间:2013-01-04 18:30:53

标签: java oop interface abstract-class

  

可能重复:
  Why does ArrayList have “implements List”?

我已经阅读了几篇文章Diff b/w I vs AC以及关于何时使用界面与抽象类的问题。

当我偶然发现ArrayList类时,ArrayList类扩展了AbstractList类实现的List接口。 AbstractList和List有常见的方法,如add(),remove()等。

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

当两种方法都有共同的方法时,这种组合继承行为设计何时是首选的?

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

3 个答案:

答案 0 :(得分:2)

在这种情况下,implements List是多余的。可能要明确这个调用实现List而不必导航类层次结构。

答案 1 :(得分:2)

有时我会创建一个抽象BaseClass,它实现一个接口IBaseClass并创建ChildClass,扩展BaseClass。我的意思是:

public interface IBaseClass {

}

public abstract class BaseClass implements IBaseClass {

}

public class ChildClass extends BaseClass {

}

现在假设我有一个接口IChildClassChildClass实现了它。

public class ChildClass extends BaseClass implements IChildClass {

}

并说IBaseClass有方法someMethod。现在,如果您想通过实现接口ChildClass使用IChildClass的实例,例如:

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 ArrayListAbstructList轮流扩展AbstractCollectionAbstractCollection然后是最高级别的。目前AbstractCollection实施Collection。因此很明显,遵循这种设计模式是为了保持Java的可扩展模式。

答案 2 :(得分:0)

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