我目前正在为uni进行火车模拟项目。
这是我的班级层次结构:
RollingStock
Coach
FreightCoach
PassengerCoach
SpecialCoach
Engine
DieselEngine
ElectricEngine
SteamEngine
Trainset
我的问题:
每个教练都有唯一的ID。但是,引擎和火车集共享其ID空间(“系列名称”)。 “名称”由RollingStock继承,并且Trainset和Engine都具有属性“系列”。
我创建了一个类“ SharedIdSpace”来实现此功能。但是我不太确定如何很好地解决这个问题(TreeMap,...,?)。
现在,我的主要问题是我必须实现以下功能:
“机车车辆可以编成火车。编排时必须遵守以下限制:
有效火车的起点或终点必须始终有至少一部机车/火车组。
组成时,必须始终考虑机车车辆在所需组成点处是否具有合适的联轴器。
组成的机车车辆尚未在另一列火车中使用。
[...]“
我该如何实施?恐怕我没有有用的主意。
最佳答案
我不确定您要问的是什么,但我会尽力告诉您:
您需要创建一个复合对象,其中每个对象都有唯一的ID,并且需要通过一些验证。
我将实现“ StoregeManager”,“ ComposerManager”,并在“ RollingStock”中添加抽象验证器方法,以验证是否可以添加vagon。
流将是这样的:
免责声明这是用Java编写的,但是使用notepad ++时,请勿检查sintaxis。
RollingStock freightCoach = StoregeManager.getFreightCoach();
RollingStock specialCoach = StoregeManager.getSpecialCoach();
RollingStock dieselEngine = StoregeManager.getDieselEngine();
// Check if they are null or throw an exception if has no more elements. Maybe from BBDD or from where you want
Composer.compone()
.add(dieselEngine)
.add(freightCoach)
.add(specialCoach)
.build()
在componer内部,是这样的:
public class Composer {
private StoregeManager storeManager; //Injected or initialized, as you want.
private static Train train;
public Composer build(){
train = new Train;
return this;
}
public Composer add(RollingStock rs) {
if(rs.isValid(train))
train.add(rs);
return this;
}
public RollingStock[] build() {
storageManager.ckeckTrain(train);
return train;
}
}
您可以将存储放入Composer内,如果需要其他解决方案,可以将vagon的类名作为参数传递。
我希望这可以帮助你。