我有一个GenericContainer类和一个扩展通用类的FIFOContainer类。尝试使用takeout()方法时出现我的问题。它无法识别我在FIFOContainer ArrayList中保存值。 我怀疑这与我定义构造函数的方式有关,但是我一生无法弄清楚如何解决它。
我想到的一个解决方案是在GenericContainer类中定义一个getter并在FIFOContainer类中传递该值,但我认为不需要这样做。
public abstract class GenericContainer implements IBag {
private ArrayList<ISurprise> container;
public GenericContainer() {
this.container = new ArrayList<ISurprise>();
}
@Override
public void put(ISurprise newSurprise) {
this.container.add(newSurprise);
}
@Override
public void put(IBag bagOfSurprises) {
while (!bagOfSurprises.isEmpty()) {
System.out.println(bagOfSurprises.size());
this.container.add(bagOfSurprises.takeout());
}
}
@Override
public boolean isEmpty() {
if (this.container.size() > 0) {
return false;
}
return true;
}
@Override
public int size() {
if (isEmpty() == false) {
return this.container.size();
}
return -1;
}
}
public class FIFOContainer extends GenericContainer {
private ArrayList<ISurprise> FIFOcontainer;
public FIFOContainer() {
super();
this.FIFOcontainer = new ArrayList<ISurprise>();
}
public ISurprise takeout() {
if (isEmpty() == false) {
this.FIFOcontainer.remove(0);
ISurprise aux = this.FIFOcontainer.get(0);
return aux;
}
return null;
}
}
答案 0 :(得分:1)
事实是:字段不是词素的(例如,请参见here)。
您的问题:基本上,您的isEmpty()
将使用基类中的容器,而另一个方法将使用子类中的容器。
是的,您的课程中有两个容器。
一种更好的方法可能是(例如)在基类GenericContainer中执行此操作:
protected abstract List<ISurprise> getContainer();
换句话说:子类可以提供自己的容器,而基本方法isEmpty()
可以使用该容器:
@Override
public final boolean isEmpty() {
return getContainer().isEmpty();
}
为了允许更多的自由度,该方法还可以具有稍微不同的签名,例如protected abstract Collection<ISurprise>
,以使实际实现更加灵活。
(提示:我将方法定为最终方法,因为这是在抽象基类中定义的方法的整体思想:子类不会覆盖它们)
(和额外的提示:尽量减少编写的代码量。当列表类已经为您提供了一个{@}}时,您不需要someBool == true/false
,也不需要getSize() == 0
isEmpty()方法)
答案 1 :(得分:0)
您不应在FIFOContianer
中创建新的数组列表。您已经有GenericContainer
的列表。
因此,现在,当您调用put
时,它会将项目添加到父类的container
列表中。调用takeout
时,您将访问在子类中创建的 other 列表(FIFOcontainer
)。
只需删除FIFOcontainer
并继续使用container
:
public ISurprise takeout() {
if (isEmpty() == false) {
this.container.remove(0);
ISurprise aux = this.container.get(0);
return aux;
}
return null;
}