什么是此模型的正确继承/聚合

时间:2014-12-08 04:47:37

标签: inheritance associations uml aggregation

我正在制作一套列车的UML,特别是:

机车(包含所有联网汽车阵列的机动车) BoxCar(携带盒子/动物/货物) RefrigeratorCar(携带食物)

我做了一个名为RailCar的抽象类,机车,BoxCar和RefrigeratorCar都扩展了。所以这就是问题,机车通过继承与RailCar相关,并且还拥有与众多RailCars的has-a(聚合)关系。

这是一个糟糕的设计吗?如果是,你如何正确地用UML表示机车,因为它与同一个类有继承和聚合关系?

2 个答案:

答案 0 :(得分:0)

我认为将火车的概念模型化为Train类与你的RailCar类具有一对多的组合关系更为现实,并指出列车是由轨道车。然而,你的Locomotive不仅仅是像其他车一样的普通轨道车,因为你可能想要模拟“火车只包含一个机车和任意数量的BoxCars或RefrigeratorCars”这样的事实。在这种情况下,您最好将LocomotiveRailCar类分开(不要将它们包含在RailCar下),这样您就可以在{{{{}}之间表达单独的一对一组合关系。 1}}和Train

答案 1 :(得分:0)

我也喜欢上火车课。但我仍然喜欢所有单位的基类。 (我只是不称它为RailCar;也许" TrainUnit"或者某些东西会更具描述性)。机车和汽车都具有共同的特征(制动器和连接器,例如,更不用说轮子),可以(并且应该是恕我直言)推广到基类中。

如果所有广义元素对所有汽车的工作方式相同,那么这个基类也不一定是抽象的。即使它们不完全相同,您也可以在需要时对子类使用覆盖和重载,而无需进行抽象。作为一般规则,如果大多数子类将使用相同的实现,请对异常使用重写/重载。如果它们中的大多数将以不同的方式工作,那就把它变成抽象的(没有必要提供一个没有人会使用的实现的麻烦)。

然后,列车是单位的集合,具有(可能的)约束,即至少一个必须是机车。 (例如,一串汽车可能坐在终点站等待机车。)