使用在child中定义的字段为父的构造函数调用辅助方法

时间:2015-08-27 13:59:20

标签: java inheritance constructor

我在使用其父构造函数实例化子对象时遇到问题。构造函数调用其辅助方法但我希望该方法中使用的变量是子字段。

我不确定这是否有意义,所以我将下面的类简化版本。基本上它是一个模拟空中交通的简单Java程序。当程序处理几种类型的平面时,创建了父类(Plane)以及与每种类型对应的一些子类。目前,Factory类(PlaneFactory)用于根据概率生成其中一种类型的平面。

创建平面时,会分配ID和时间戳。另一件需要做的事就是设定剩余燃料时间。这是在平面构造函数中调用的辅助方法generateInitialFuelTime()中完成的。该方法返回最小值和最大值之间的随机数。每种类型的平面都有不同的最小值和最大值,所以当调用generateProbability()时,我希望它使用minFuelTime和maxFuelTime值定义为子类中的字段,但它似乎正在查看它的父节点(其中是空的。

我考虑过制作generateInitialFuelTime()或设置minFuelTime& maxFuelTime值作为构造函数的参数,但不太确定它是否是最好的方法。

PlaneFactory类

 2     3     0
 7     7     1
 4     3     0
12    12     0

 2     3     0
 8     7     0
 3     2     0
11    10     0

 1     3     1
 6     6     0
 3     3     0
13    14     0

 3     0     0
 8     8     1
 3     2     0
17    10     0

平面类(父类):

public class PlaneFactory {
    public Plane getPlane(int id, Time time){
        Plane plane = null;
        double probability = generateProbability();
        if (0.5 > probability) {
            plane = new Type1Plane();
        } else if (0.2 > probability) {
            plane = new Type2Plane();
        }
        return plane;
    }
    private double generateProbability() {
        // This method returns a probability between 0 and 1
    }
}

Type1Plane类(子类):

public class Plane{
    protected int id;
    protected Time initialRemainingFuelTime;
    protected Time initializedTime;
    protected int minFuelTime;
    protected int maxFuelTime;

    public Parent(int id, Time currentTime) {
        this.id = id;
        initializedTime = currentTime;
        initialFuelTime = generateInitialFuelTime();
    }

    protected Time generateInitialFuelTime() {
        Random r = new Random();
        int min = getMinFuelTime().getMinute() + 1;
        int range = getMaxFuelTime().getMinute() - getMinFuelTime().getMinute();
        int initialFuelTime = r.nextInt(min) + range;
        return new Time (0, randomMinute , 0);
    }

    protected Time getMinFuelTime() {
          return minFuelTime;
    }

    protected Time getMaxFuelTime() {
          return maxFuelTime;
    }

Type2Plane类(子类):

public class Type1Plane extends Plane{
    private int minFuelTime = new Time(0, 20, 0) // 20 minute
    private int maxFuelTime = new Time(0, 40, 0) // 40 minute

    public Type2Plane (int id, Time currentTime) {
        super(id, currentTime);
    }
}

如果您对此问题有一个很好的解决方案,请告诉我。谢谢你的时间。

3 个答案:

答案 0 :(得分:2)

只需覆盖您的子课程中的getMinFuelTimegetMaxFuelTime

public class Type1Plane extends Plane{
    private Time minFuelTime = new Time(0, 20, 0) // 20 minute
    private Time maxFuelTime = new Time(0, 40, 0) // 40 minute

    public Type2Plane (int id, Time currentTime) {
        super(id, currentTime);
    }

    protected Time getMinFuelTime() {
          return minFuelTime;
    }

    protected Time getMaxFuelTime() {
          return maxFuelTime;
    }
}

Type2Plane也是如此。

现在,如果Plane类永远不应该自己实例化,那么将其设为abstract和get方法(并删除变量):

public abstract class Plane{
    protected int id;
    protected Time initialRemainingFuelTime;
    protected Time initializedTime;

    public Parent(int id, Time currentTime) {
        this.id = id;
        initializedTime = currentTime;
        initialFuelTime = generateInitialFuelTime();
    }

    protected Time generateInitialFuelTime() {
        Random r = new Random();
        int min = getMinFuelTime().getMinute() + 1;
        int range = getMaxFuelTime().getMinute() - getMinFuelTime().getMinute();
        int initialFuelTime = r.nextInt(min) + range;
        return new Time (0, randomMinute , 0);
    }

    protected abstract Time getMinFuelTime();
    protected abstract Time getMaxFuelTime();

}

顺便提一下,请注意,您的变量似乎有些不一致,您将时间变量视为int或反之亦然。

答案 1 :(得分:0)

您需要覆盖子类中的getMinFuelTime和getMaxFuelTime方法。

答案 2 :(得分:0)

由于子类是在父类之后初始化的,因此不能依赖超类构造函数中子类的字段。

您可以做的是通过abstract方法提供自定义行为,基本上

private int minFuelTime = new Time(0,20,0);
protected Time getMinFuelTime() { return minFuelTime; }

变为:

class Planet {
    protected abstract Time getMinFuelTime();
}

class Type1Plane extends Planet {
    @Override
    protected Time getMinFuelTime() { return new Time(0,20,0); }
}

这是允许的,因为此时没有需要由子类初始化的“缺失漏洞”,因为在初始化父级时,任何情况下都会出现实现。