抽象和非抽象类的构造方法

时间:2019-05-09 13:07:27

标签: java

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

2 个答案:

答案 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;
    }