UML类图中的类层次结构组合

5
我想知道是否可以像我这样建立下面两个类层次之间的关系模型: car-engine composition relationship 表示这个意思的代码可能是这样的:
public abstract class Car
{
    protected Engine engine;  
}
public class StreetCar extends Car
{
     public StreetCar()
     {
          engine = new StreetEngine();
     }
}

对于类OffroadCar同样如此,它会执行类似的操作engine = new OffroadEngine()。我没有包含关于accelerate()方法的任何内容,因为它与本题无关。

我只想知道这个组合模型是否被正确建模,或者添加那么多组合箭头是否是冗余的甚至错误的。


这感觉像是作业。如果是的话,请标注一下。 - Jochen
1个回答

3
在回答问题之前,这是一个需要将层次关系和组合关系分开的例子,好像它们是不同类型的图表一样。
注意:我在图表中添加了“Engine”作为“protected”和“Class”前缀,以避免混淆。
(1) 组合图表
“CarClass”对象由一个“EngineClass”的单独对象组成。
..............................................................................
..+-------------------------------------+........+-------------------------+..
..|           <<abstract>>              |........|      <<abstract>>       |..
..|             CarClass                |........|       EngineClass       |..
..+-------------------------------------+........+-------------------------+..
..| [#] Engine: EngineClass             |<*>-----+ [+] startEngine(): void |..
..+-------------------------------------+........+-------------------------+..
..| [+] acelerate(): void <<virtual>>   |.....................................
..+-------------------------------------+.....................................
..............................................................................

(2.1) 继承图

"CarClass"对象可能会在某些情况下拥有子类。

...........................................
..+-------------------------------------+..
..|           <<abstract>>              |..
..|             CarClass                |..
..+-------------------------------------+..
..| [#] Engine: EngineClass             |..
..+-------------------------------------+..
..| [+] acelerate(): void <<override>>  |..
..+-----------------+-------------------+..
.................../.\.....................
................../...\....................
.................+--+--+..............................................................
....................|.................................................................
....................+------------------------------------------+......................
....................|..........................................|......................
..+-----------------+-------------------+....+-----------------+-------------------+..
..|           <<concrete>>              |....|           <<concrete>>              |..
..|            StreetCarClass           |....|           OffRoadCarClass           |..
..+-------------------------------------+....+-------------------------------------+..
..| [+] acelerate(): void <<override>>  |....| [+] acelerate(): void <<override>>  |..
..+-------------------------------------+....+-------------------------------------+..
......................................................................................

(2.2) 继承图

在某些情况下,“EngineClass”的对象可能有子类。

...........................................
..+-------------------------------------+..
..|           <<abstract>>              |..
..|             EngineClass             |..
..+-------------------------------------+..
..| [+] acelerate(): void <<override>>  |..
..+-----------------+-------------------+..
.................../.\.....................
................../...\....................
.................+--+--+..............................................................
....................+------------------------------------------+......................
....................|..........................................|......................
....................|..........................................|......................
..+-----------------+-------------------+....+-----------------+-------------------+..
..|           <<concrete>>              |....|           <<concrete>>              |..
..|          StreetEngineClass          |....|          OffRoadEngineClass         |..
..+-------------------------------------+....+-------------------------------------+..
..| [+] startEngine(): void <<override>>|....| [+] startEngine(): void<<override>> |..
..+-------------------------------------+....+-------------------------------------+..
......................................................................................

答案3

现在,这是一个情况,其中一个类至少有一个组成成员,并且其类型可能在主类被覆盖时被覆盖。这有时被称为“平行层次结构软件模式”或“双层次结构软件模式”。

您只提到了每个主类的2个子类,但实际上可能会有更多。

通常我以两种方式制作此类图表。一种是制作第一个图表,并添加注释,指示这种情况。

3.1 主要平行层次结构图

..............................................................................
..+-------------------------------------+........+-------------------------+..
..|           <<abstract>>              |........|       <<abstract>>      |..
..|             CarClass                |........|        EngineClass      |..
..+-------------------------------------+........+-------------------------+..
..| [#] Engine: EngineClass             |<*>-----+ [+] startEngine(): void |..
..+-------------------------------------+........+------------+------------+..
..| [+] acelerate(): void <<virtual>>   |.....................|...............
..+--------------+----------------------+.....................|...............
.................|............................................|...............
.................+--------------------------------------------+...............
.................|............................................................
........+--------+-------+....................................................
........|   Note:        |....................................................
........|   Paralell     /....................................................
........|   Hierarchy   /| ...................................................
........|              / |....................................................
........+-------------/--+....................................................
..............................................................................

第二种情况是,当两个类都有子类并且这些子类都添加了成员时。 3.2 附加的平行层次结构图
..............................................................................
..+---------------------------------------+........+-------------------------+..
..|             <<concrete>>              |........|       <<concrete>>      |..
..|            OffRoadCarClass            |........|    OffRoadEngineClass   |..
..+---------------------------------------+........+-------------------------+..
..| [+] createEngine(): void <<override>> |<*>-----+ [+] startEngine(): void |..
..+---------------------------------------+........| [+] nitroLevel(): void  |..
..| [+] useNitro(): void                  |........+------------+------------+..
..| [+] acelerate(): void <<override>>    |.....................|...............
..+--------------+------------------------+.....................|...............
.................|..............................................|...............
.................+----------------------------------------------+...............
.................|............................................................
........+--------+-------+....................................................
........|   Note:        |....................................................
........|   Paralell     /....................................................
........|   Hierarchy   /| ...................................................
........|              / |....................................................
........+-------------/--+....................................................
..............................................................................

如果需要,我可以添加额外的图示。

4 展示代码

通常为了管理这些"并行"的层次结构,创建组合成员的方法会被重写。

public abstract class EngineClass
{
    public void startEngine() { ... }  
} // EngineClass

public abstract class CarClass
{
    protected EngineClass engine;  

    public CarClass()
    {
      // ...
    }

    public EngineClass createEngine()
    {
      EngineClass Result = new EngineClass();
      return Result;
    }

    public void start()
    {
      this.Engine = createEngine();
    }
} // CarClass

public class StreetCarClass extends CarClass
{
     public StreetCarClass()
     {
       // ...
     }

    @override
    public EngineClass createEngine()
    {
      EngineClass Result = new StreetCarEngineClass();
      return Result;
    }
} // StreetCarClass 

public class OffRoadCarClass extends CarClass
{
     public OffRoadCarClass()
     {
       // ...
     }

    @override
    public EngineClass createEngine()
    {
      EngineClass Result = new OffRoadCarEngineClass();
      return Result;
    }
} // OffRoadCarClass 

public class ExampleClass
{
    public static main()
    {
      EngineClass OffRoadCar = new OffRoadCarClass();
      OffRoadCar.start();
    }
} // OffRoadCarClass

干杯。

附言:我可以要一个Fishburguer吗?


1
你用什么工具生成这些图表的? - Marvo
3
好的,我会尽力进行翻译。以下是需要翻译的内容:@Marvo:这个工具http://www.asciiflow.com/#Draw,但是我手动编写了一些东西。 - umlcat
非常感谢您全面涵盖这个主题所做的努力。但是我不太理解某些内容。我无法制作多个大图。我应该理解我上面的图表是正确的,只需要添加“并行层次结构”注释吗? - annouk
@annouk:你的图表是正确的。在U.M.L.中,制作图表有几种方法,并不意味着它们是错误的。我只是发布了一个包含不同图表的替代性解决方案。只需添加评论即可。 - umlcat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接