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中使用什么方法.在不完全理解接口以及继承和组合之间,我有点迷失.我似乎还不能"得到它"......
任何帮助将不胜感激,谢谢!
对于组合,堆栈类应该有一个列表,而不是实现或扩展基于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作为内部结构的事实.