【问题标题】:How to do train composition - compositon of classes如何做训练作文——班级作文
【发布时间】:2020-05-26 19:21:06
【问题描述】:

我目前正在为 uni 做一个火车模拟项目。

这是我的类层次结构:

RollingStock
    Coach
        FreightCoach
        PassengerCoach
        SpecialCoach
    Engine
        DieselEngine
        ElectricEngine
        SteamEngine
    Trainset

我的问题:

  • 每个教练都有一个唯一的 ID。然而,Engines 和 Trainsets 共享它们的 ID-Space(“series-name”)。 RollingStock 继承了“Name”,TrainsetEngine 都具有“series”属性。

我创建了一个“SharedIdSpace”类来实现这个功能。但我不太确定如何很好地解决这个问题(TreeMap,...,?)。

现在,我的主要问题是我必须实现以下功能:

"机车车辆可以编成火车。编组时必须遵守以下限制:

  • 必须始终在有效火车的开头或结尾设置至少一个机车/火车。
  • 在组合时,必须始终考虑机车车辆在所需组合点是否有合适的联轴器。
  • 正在组合的机车车辆尚未在另一列火车上使用。 [...]"

我该如何实现呢?恐怕我没有有用的想法。

【问题讨论】:

    标签: java object-composition


    【解决方案1】:

    我不确定你在问什么,但我会尽量给你我的近似值:

    您需要创建一个复合对象,其中每个对象都有一个唯一的 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()
    
    

    在组件内部,是这样的:

    
    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 的类名作为参数传递。

    希望对你有帮助。

    【讨论】:

    • 感谢您的帮助!但是,我不太明白应该如何实现 StorageManager。请您详细说明一下。
    • compone() 方法应该做什么?到目前为止,我使用 ArrayList 实现了您的想法。
    • 如您所说:``` 正在组合的机车车辆尚未在另一列火车上使用。 ``` 存储管理器检查是否有其他火车没有使用的元素。如何?您可以将所有元素加载到内存或数据库中,并用一列标记是否使用。您向 StorageManager 提出请求,它会检查是否可以返回您想要的类型的元素。如果不是,则返回 null 或抛出异常。如果它可以返回,则将该元素标记为已使用或将其从内存中删除
    • 好的。您是否也对共享 ID 空间(引擎和火车组)有所了解。
    • 如果我错了,请纠正我。 ¿ ID 空间不只是一个组合 ID 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2018-04-15
    • 2022-08-16
    • 1970-01-01
    • 2017-02-02
    • 2019-01-21
    • 2012-09-06
    相关资源
    最近更新 更多