2014-12-08 96 views
0

我作出了UML的一组火车车厢,专门正确继承/聚合:什么是这种模式

车(包含所有连接汽车的数组电动车) 棚车(携带箱/动物/货物) 冰箱汽车(携带食物)

我做了一个叫做RailCar的抽象类,机车,BoxCar和RefrigeratorCar都扩展了。所以问题在于,机车通过继承与RailCar相关,并与许多RailCars拥有一个(聚合)关系。

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

+1

请包括您当前的设计,这就是UML的用处;让每个人都了解你是如何设计你的系统的。 :-)没有任何东西是'UML'。我想你做了一个类图? – zondvloed 2014-12-08 09:00:28

回答

0

我认为将火车的概念建模为类Train与您的RailCar类具有一对多组成关系的模型会更现实,指出列车是由轨道车组成的。然而,您的Locomotive不只是像其他人一样的普通轨道车,因为您可能想要模拟像“一列火车只包含一个机车和任意数量的BoxCars或冰箱车”这样的事实。在这种情况下,您应该更好地保留LocomotiveRailCar类(不包括在RailCar之下),以便您可以在TrainLocomotive之间表示单独的一对一构图关系。

0

我也喜欢上Train班。但我仍然喜欢所有单位的基础类的想法。 (我不会称之为RailCar;也许“TrainUnit”或其他更具描述性的内容)。机车和汽车都具有共同的特征(刹车和连接器,例如,更不用说车轮),它们可以(也应该是恕我直言)泛化到基类中。

如果所有广义元素对所有车辆都以相同的方式工作,则此基类不一定是抽象的。即使它们不完全相同,您也可以在需要时使用覆盖和重载的子类,而无需进行抽象。作为一般规则,如果大多数子类将使用相同的实现,则使用覆盖/重载来处理异常。如果他们中的大多数都会以不同的方式工作,那么将其抽象化(没有意思是提供没有人会使用的实现的麻烦)。

然后,列车是一个单位的集合,其中至少有一个必须是火车头。 (例如,可能有一串汽车坐在总站,等待机车。)