java继承与组合(实现堆栈)

lit*_*leK 3 java inheritance stack list composition

我试图在java中实现一个堆栈(使用列表接口:接口列表).

我想以两种不同的方式实现它:使用组合和继承.

对于继承,到目前为止我有:

 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.ListIterator;

 public class StackInheritance implements List {
      //implement list methods
 }
Run Code Online (Sandbox Code Playgroud)

对于作文,我有:

 import java.util.List;

 public abstract class StackComposition implements List {
     // implement some standard methods
 }

 public class StackViaList extends StackComposition {
     // implement methods that have not been implemented in the abstract
     // class
 }
Run Code Online (Sandbox Code Playgroud)

我很困惑从哪里开始.我之前从未使用过接口,所以我是否应该使用List方法来"模仿"堆栈,例如使用Array或ArrayList?

另外,对于合成,我不明白应该在StackComposition中使用哪些方法以及应该在StackViaList中使用什么方法.在不完全理解接口以及继承和组合之间,我有点迷失.我似乎还不能"得到它"......

任何帮助将不胜感激,谢谢!

And*_*ite 9

对于组合,堆栈类应该有一个列表,而不是实现或扩展基于List的类.继承是一种"IS A"关系,而组合是"HAS A"关系.

例如:

public class StackWithComposition
{
    // StackWithComposition HAS A List (rather than IS A List)
    private List myList = new ArrayList();

    public void push(object item)
    {
        // add item to myList, etc.
    }

    public object pop()
    {
        // return item at top (or end) of myList
    }

    // etc.
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可能希望将其设置为泛型类,而不是处理原始对象,但这可能是个主意.

在这种情况下,基于组合的解决方案可能优于基于继承的解决方案.当你从类/接口继承时,你应该问自己,Stack是List吗?大多数Stacks不应该为用户提供对所有原始List方法的访问权限,因此最好隐藏您正在使用List作为内部数据结构的面.使用组合列表可以完全隐藏您使用List作为内部结构的事实.