gpt4 book ai didi

java - 抽象类和非抽象类中的构造函数

转载 作者:行者123 更新时间:2023-11-30 05:39:01 26 4
gpt4 key购买 nike

我有一个 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;
}
}

最佳答案

事实是:字段不是多态的(例如,请参见here)。

你的问题:基本上是你的isEmpty()会使用基类中的容器,另一个方法会使用子类中的容器。

是的,您的类(class)中有两个容器。

更好的方法可能是(例如)在基类 GenericContainer 中执行此操作:

protected abstract List<ISurprise> getContainer();

换句话说:子类可以提供自己的容器和基本方法,如 isEmpty()可以使用那个:

@Override
public final boolean isEmpty() {
return getContainer().isEmpty();
}

为了允许更多的自由度,该方法还可以具有稍微不同的签名,例如 protected abstract Collection<ISurprise>在实际执行中要更加灵活。

(提示:我将该方法设为 final方法,因为这是在抽象基类中定义的方法的整体思想:子类不会覆盖它们)

( 和额外提示:尽量减少您编写的代码量。您不执行 someBool == true/false ,当该列表类已经为您提供 isEmpty() 方法时,您不需要执行 getSize() == 0 )

关于java - 抽象类和非抽象类中的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56060162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com