我目前正在为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的类名作为参数传递。

我希望这可以帮助你。

09-27 08:48