Java 调用父对象的帮助器方法';子类中定义了字段的s构造函数
我在使用其父构造函数实例化子对象时遇到问题。构造函数调用其helper方法,但我希望该方法中使用的变量是子字段 我不确定这是否有意义,所以我把这些类的简化版本放在下面。基本上,它是一个模拟空中交通的简单Java程序。当程序处理几种类型的平面时,会创建一个父类(平面)以及对应于每种类型的一些子类。目前,工厂类(PlaneFactory)用于根据概率生成其中一种类型的平面 创建平面时,会分配id和时间戳。另一件需要做的事情是设置剩余的燃油时间。这是在助手方法generateInitialFuelTime()中完成的,该方法在平面构造函数中调用。该方法返回最小值和最大值之间的随机数。每种类型的平面都有不同的最小值和最大值,因此在调用generateProbability()时,我希望它使用定义为子类中字段的minFuelTime和maxFuelTime值,但此时它似乎正在查看其父类的值(为null) 我考虑过将generateInitialFuelTime()或将minFuelTime和maxFuelTime值设置为构造函数的参数,但不确定这是否是最好的方法 平面工厂类:Java 调用父对象的帮助器方法';子类中定义了字段的s构造函数,java,inheritance,constructor,Java,Inheritance,Constructor,我在使用其父构造函数实例化子对象时遇到问题。构造函数调用其helper方法,但我希望该方法中使用的变量是子字段 我不确定这是否有意义,所以我把这些类的简化版本放在下面。基本上,它是一个模拟空中交通的简单Java程序。当程序处理几种类型的平面时,会创建一个父类(平面)以及对应于每种类型的一些子类。目前,工厂类(PlaneFactory)用于根据概率生成其中一种类型的平面 创建平面时,会分配id和时间戳。另一件需要做的事情是设置剩余的燃油时间。这是在助手方法generateInitialFuelTi
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); }
}