Java 调用父对象的帮助器方法';子类中定义了字段的s构造函数

Java 调用父对象的帮助器方法';子类中定义了字段的s构造函数,java,inheritance,constructor,Java,Inheritance,Constructor,我在使用其父构造函数实例化子对象时遇到问题。构造函数调用其helper方法,但我希望该方法中使用的变量是子字段 我不确定这是否有意义,所以我把这些类的简化版本放在下面。基本上,它是一个模拟空中交通的简单Java程序。当程序处理几种类型的平面时,会创建一个父类(平面)以及对应于每种类型的一些子类。目前,工厂类(PlaneFactory)用于根据概率生成其中一种类型的平面 创建平面时,会分配id和时间戳。另一件需要做的事情是设置剩余的燃油时间。这是在助手方法generateInitialFuelTi

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

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

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

我考虑过将generateInitialFuelTime()或将minFuelTime和maxFuelTime值设置为构造函数的参数,但不确定这是否是最好的方法

平面工厂类

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
    }
}
平面类(父类):

类型1平面类(子类):

类型2平面类(子类):


如果你有解决这个问题的好办法,请告诉我。感谢您的时间。

您需要在子类中重写getMinFuelTime和getMaxFuelTime方法。

只需在子类中重写
getMinFuelTime
getMaxFuelTime
,如下所示:

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
类永远不应该单独实例化,那么将其
抽象为
以及get方法(并删除变量):


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

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

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

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); }
}

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

对不起,我认为PlaneFactory中生成Type2Plane时存在缺陷,但请忽略它。不管怎样,我希望你能明白。
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;
    }
}
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();

}
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); }
}