我在使用其父构造函数实例化子对象时遇到问题。构造函数调用其辅助方法但我希望该方法中使用的变量是子字段。
我不确定这是否有意义,所以我将下面的类简化版本。基本上它是一个模拟空中交通的简单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);
}
}
如果您对此问题有一个很好的解决方案,请告诉我。谢谢你的时间。
答案 0 :(得分:2)
只需覆盖您的子课程中的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
类永远不应该自己实例化,那么将其设为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); }
}
这是允许的,因为此时没有需要由子类初始化的“缺失漏洞”,因为在初始化父级时,任何情况下都会出现实现。